设计模式-代理模式

设计模式-代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。在该模式中,代理类代表了一个真实主题(Real Subject),并提供了与真实主题相同的接口,以便在客户端调用时可以透明地替代真实对象。

抽象提取理论:

  1. 抽象主题
  2. 真实主题
  3. 代理

代码需求:追女孩~ 小明喜欢软软,但是小明很害羞,希望通过小硬送礼物给软软。如果用代码实现这个流程,如何实现呢?

代理实现

代码结构图

设计模式-代理模式_第1张图片

  • 代理和追求者共拥有的方法:送礼物
  • 代理所表示的真实实体:追求者-小明
  • 代理类:小硬
  • 客户端:软软

代码实现:

/**
 * 送礼物接口
 */
public interface IGift {
    /**
     * 送洋娃娃
     */
    void giveDolls();

    /**
     * 送鲜花
     */
    void giveFlowers();

    /**
     * 送巧克力
     */
    void giveChocolate();

}
/**
 * 追求者-小明
 */
public class Suitor implements IGift{
    
    /**
     * 追求的对象
     */
    private ThePursued thePursued;

    public Suitor (ThePursued thePursued){
        this.thePursued = thePursued;
    }

    @Override
    public void giveDolls() {
        System.out.println(thePursued.getName() + "我给你送洋娃娃");
    }

    @Override
    public void giveFlowers() {
        System.out.println(thePursued.getName() + "我给你送鲜花");
    }

    @Override
    public void giveChocolate() {
        System.out.println(thePursued.getName() + "我给你送巧克力");
    }
}
/**
 * 被追求者-软软
 */
public class ThePursued {
    private String name;

    public ThePursued(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }
}
/**
 * 代理-小硬
 * 同时有追求者和被追求者信息
 */
public class Proxy implements IGift{

    // 追求者
    private Suitor suitor;


    /**
     *  获取被追求者信息
     */
    public Proxy(ThePursued thePursued){
        suitor = new Suitor(thePursued);
    }

    @Override
    public void giveDolls() {
        suitor.giveDolls();
    }

    @Override
    public void giveFlowers() {
        suitor.giveFlowers();
    }

    @Override
    public void giveChocolate() {
        suitor.giveChocolate();
    }
}
/**
 * 客户端-测试
 */
public class ProxyDemo {
    public static void main(String[] args) {
        // 被追求者
        ThePursued thePursued = new ThePursued("软软");

        // 代理
        Proxy proxy = new Proxy(thePursued);

        proxy.giveChocolate();
        proxy.giveDolls();
        proxy.giveFlowers();
    }
}

输出结果:

Connected to the target VM, address: '127.0.0.1:30065', transport: 'socket'
软软我给你送巧克力
软软我给你送洋娃娃
软软我给你送鲜花
Disconnected from the target VM, address: '127.0.0.1:30065', transport: 'socket'

实用场景举例:

  1. 远程代理(Remote Proxy)
    • 在分布式系统中,客户端可能需要调用远程服务器上的服务或对象。远程代理为本地客户端提供一个接口,使得客户端像调用本地方法一样调用远程对象的方法,而网络通信、数据序列化和反序列化等细节由代理类处理。
  2. 虚拟代理(Virtual Proxy)
    • 当加载资源耗时较长时,如大图片、视频文件的预加载。虚拟代理可以在图片未完全加载前显示占位符,当真实图片加载完毕后立即替换占位符。
    • 在Web应用中,可以使用懒加载技术,只有当用户滚动到可视区域时才动态加载内容。
  3. 缓存代理(Caching Proxy)
    • 缓存代理在访问数据库或其他昂贵计算结果时非常有用。它会检查请求是否已经在缓存中,如果存在则直接返回缓存结果,否则才去查询真实对象并更新缓存。
  4. 保护代理(Protection Proxy)
    • 控制对敏感操作或受保护对象的访问权限,例如,在软件授权系统中,可以通过代理控制对特定功能的访问,仅允许经过身份验证和授权的用户执行操作。
  5. 日志记录代理(Logging Proxy)
    • 在方法调用前后自动添加日志记录,方便追踪系统的运行状态和问题定位,同时不污染业务逻辑代码。
  6. 同步代理(Synchronization Proxy)
    • 当多个线程需要访问同一资源时,同步代理可以确保资源以线程安全的方式被访问。
  7. 智能引用代理(Smart Reference Proxy)
    )**:
    • 在方法调用前后自动添加日志记录,方便追踪系统的运行状态和问题定位,同时不污染业务逻辑代码。
  8. 同步代理(Synchronization Proxy)
    • 当多个线程需要访问同一资源时,同步代理可以确保资源以线程安全的方式被访问。
  9. 智能引用代理(Smart Reference Proxy)
    • 对象的生命周期管理,例如Java中的弱引用代理,它可以作为对象的一个轻量级引用,当该引用指向的对象不再有强引用时,垃圾回收器可以回收该对象。

你可能感兴趣的:(设计模式,代理模式)