一.代理:
1.首先明白一下什么是代理?
给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。
即:
说白了就是这件事客户本身不做,找代理人做,然后代理人不仅可以完成客户需求的功能,还能完成一些附加功能。
二.代理模式:
1.代理模式的三个要素:
- 接口:约定了该服务提供的能力或者功能,比如生产厂商,规定该厂商应该生产哪些产品。
- 真实对象:实现了改接口,具有改接口的真实的方法。
- 代理对象:帮忙代购的代理人。
2.代理模式类图:
张三通过代理人间接买到了想要买到的海外商品。并且代理人可以额外追加商品包装和售后服务的功能
3.代码举例:
1.首先定义一个接口:我们这里定义一个电脑厂家接口:
2.定义一个真实对象:我们这里定义一个生产MacBook的厂商,实现了电脑厂家接口
3.定义一个代理对象ProxyBean
增加额外功能,将生产出来的电脑进行包装和售后服务。
4.测试:
5.运行结果:
结论:根据代码可以得出一个这样的结论,代理(ProxyBean对象)可以不用通过改变真实对象(MacBookFactory)中的方法,而是通过额外追加的方法来增强真实对象的功能。
4.总结:
对于上面写的代码,我们做出以下总结:
- 首先,我们需要创建一个接口,规定一些规则(方法)。
- 其次,我们需要创建一个实现了该接口的实现类,该类即上文所说的真实类,重写了接口所规定的方法。
- 最后,我们需要创建实现了该接口的代理类,该代理类属性必须是所实现的接口,并且带有该接口为参数的构造器和重写该接口的方法,写具体逻辑。该代理类还可以增加额外的方法。
5.思考该代码存在的问题
比如现又有新的客户要买一部手机,他找到了代理对象,想要代理对象为他去海外代购一部iphone12.此时该怎么办?
我们来看代码:
1.首先,按照上面的总结,我们得定义一个手机工厂接口。
2.然后定义真实类。去实现手机工厂接口,并重写其方法。
3.最后在已有的代理类上实现手机工厂接口,重写其方法,增加一个属性,手机接口,增加一个构造方法:实现手机工厂接口的类的对象进行初始化。
此代理类也可以提供相应的售后服务。
看着很完美,代理对象有一次完成了一个新客户的代理,但是,如果代理对象业务骤增,突然出现很多客户,每个客户需求都不一样,有的客户需要海外的美酒,有的需要雪茄烟,有的需要化妆品…
这代理对象便要实现酒接口,烟接口,化妆品接口,然后对继续添加相应的属性和构造器,并且重写这些接口所规定的方法。
这个代码存在问题!
为什么这么说呢:
我们继续看代码:
比如客户的需求发生了改变。客户想要买大容量的手机。那么我们就得修改手机工厂接口。
保存后,发现:
报错!报错!!!
凡是实现它的类全都报错,很明显,因为接口中的方法发生了改变。自然它的实现类也要改变。
然后就陷入了又要修改实现类的代码,很繁琐,很难受!!!
这需要不断的修改源码,使得代码的可维护型变得相当差,违背了开闭原则。
以上代码其实就是静态代理,这时代码出现了不足,需要改进,那么如何改进,请看下回:浅谈动态代理。
つづく