Appearance
让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。
场景刨析
为什么要控制对于某个对象的访问呢? 举个例子: 有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需要使用它, 并非总是需要。
数据库查询有可能会非常缓慢。你可以实现延迟初始化: 在实际有需要时再创建该对象。 对象的所有客户端都要执行延迟初始代码。 不幸的是, 这很可能会带来很多重复代码。在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现: 比如类可能是第三方封闭库的一部分。
业务需求
雷军想开一个数码小卖部,为以后退休生活做准备,代理各大厂商的手机和电脑,用代理设计模式帮他实现下
- 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();
}
小结
优点
- 可以在访问一个类时做一些控制,或增加功能
- 操作代理类无须修改原本的源代码,符合开闭原则,系统具有较好的灵活性和可扩展性
缺点:增加系统复杂性和调用链路