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