设计模式之代理模式

代理模式的概念

为其他对象提供一个代理以控制对这个对象的访问。

代理模式通常用于:

控制访问:在访问目标对象之前进行一些额外的操作(如权限验证)。

远程代理:为一个位于不同地址空间的对象提供一个本地代理。

虚拟代理:通过先处理一个简单的对象来延缓真实对象的创建。

保护代理:为不同的用户群提供不同级别的访问权限。

举个栗子:

用户想听明星唱歌,用户通过代理找到明星,代理安排明星唱歌的场地,用户来到场地,明星唱歌。

流程

用户想听歌===>代理===>收钱===>安排场地==>明星来唱歌===>清理场地

代码实现

创建明星类

java 复制代码
package org.xiji.proxy;

/**
 * 唱歌明星
 */
public class Star {
    public void sing(){
        System.out.println("明星正在唱歌");
    }
}

创建明星代理类

java 复制代码
package org.xiji.proxy;

/**
 * 明星代理
 */
public class StarProxy {
    private Star star;

    /**
     *
     * 构造函数
     */
    public StarProxy(Star star){
        this.star = star;
    }
    public void sing() {
        pay();
        System.out.println("==========================================");
        arrange();
        System.out.println("==========================================");
        System.out.println("开始唱歌");
        star.sing();
        System.out.println("结束唱歌");
        System.out.println("==========================================");
        clean();

    }

    /**
     * 收钱
     */
    public void pay(){
        System.out.println("收钱");
    }
    /**
     * 安排场地
     */
    public void arrange(){
        System.out.println("安排场地");
    }

    /**
     * 打扫场地
     */
    public void clean(){
        System.out.println("打扫场地");
    }

}

创建用户类

java 复制代码
package org.xiji.proxy;

public class Users {
    StarProxy starProxy;

    /**
     * 找代理
     * @param starProxy
     */
    public void findStarProxy(StarProxy starProxy){
        this.starProxy = starProxy;
    }

    public void listen(){
        this.starProxy.sing();
    }

}

代理模式测试类

java 复制代码
package org.xiji.proxy;



/**
 * 代理模式
 */
public class proxyMain {
    public static void main(String[] args) {

        //明星
        Star star = new Star();
        //明星===>明星代理
        System.out.println("明星找代理");
        StarProxy starProxy = new StarProxy(star);

        //想听歌了===》直接找代理完事了
        Users xiji = new Users();
        //小久想听歌了==>找到代理
        System.out.println("小久想听歌");
        xiji.findStarProxy(starProxy);
        //开始听歌
        xiji.listen();
    }
}

执行结果

相关推荐
古法老登瞎折腾5 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
智能运维指南6 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks7 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵7 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设7 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都7 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵8 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
白山编程大哥8 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Linux运维技术栈8 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
On The Road :8 小时前
Java 多线程详解:从入门到线程安全
java·python·安全