Skip to content

让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。

场景刨析

为什么要控制对于某个对象的访问呢? 举个例子: 有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需要使用它, 并非总是需要。

代理模式解决的问题

数据库查询有可能会非常缓慢。你可以实现延迟初始化: 在实际有需要时再创建该对象。 对象的所有客户端都要执行延迟初始代码。 不幸的是, 这很可能会带来很多重复代码。在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现: 比如类可能是第三方封闭库的一部分。

业务需求

雷军想开一个数码小卖部,为以后退休生活做准备,代理各大厂商的手机和电脑,用代理设计模式帮他实现下

  • Subject 卖手机
  • RealProject 苹果、华为厂商,核心是卖手机,但是选址不熟悉
  • Proxy 雷神数码专卖店:代理卖手机,附加选地址,增加广告等

编程实现

抽取公共方法

java
public interface DigitalSell {
    void sell();
}

真实的对象(未被增强的对象)

java
/**
 * 真实对象
 * @author cv大魔王
 */
public class DigitalSellReal implements DigitalSell{
    @Override
    public void sell() {
        System.out.println("销售华为手机");
    }
}

代理增强类

java
/**
 * 代理增强类
 * @author cv大魔王
 * @version 1.0
 * @date 2021/7/13 16:16
 */
public class DigitalSellProxy implements DigitalSell {

    private DigitalSell realObj = new DigitalSellReal();

    @Override
    public void sell() {
        makeAddress();
        makeAD();
        realObj.sell();
    }

    private void makeAddress(){
        System.out.println("一个人流量很高的地址");
    }

    private void makeAD(){
        System.out.println("做广告");
    }
}

使用

java
public static void main(String[] args) {
    DigitalSell realObj = new DigitalSellReal();
    realObj.sell();
    System.out.println("-----------------");

    // 代理对象,增强,同样的方法,一模一样的使用方式,增强功能,不需要使用修改代码
    DigitalSell proxySell = new DigitalSellProxy();
    proxySell.sell();
}

小结

优点

  • 可以在访问一个类时做一些控制,或增加功能
  • 操作代理类无须修改原本的源代码,符合开闭原则,系统具有较好的灵活性和可扩展性

缺点:增加系统复杂性和调用链路