策略模式、代理模式、委托模式的区别于联系
很多设计模式其实在一些优秀的框架中都是混合使用的。
# 策略模式:
策略模式是对算法的封装。定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
场景:
Spring中Aop代理策略createAopProxy(下文讲解) Spring的对象实例化策略InstantiationStrategy
# 委派模式:
委派模式的基本作用就是负责任务的调度和分配任务
场景:
类加载的双亲委派机制 SpringMVC的DispatcherServlet Spring中bean解析的BeanDefinitionParserDelegate
# 代理模式:
代理模式为其他对象提供一种代理以控制对这个对象的访问
优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
场景:
JDK动态代理和CGLIB动态代理 Spring的AOP
# 代理和策略的区别
代理是完全和具体实现有相同的接口。在一次处理中的一系列调用,往往都是使用的同一个实现类处理。
策略实际上只是只是对某个接口,下面有多重实现方案,他们的功能是一样的,只不过算法不同,每次调用都会根据情况来选择一冲合适的策略执行。
# 代理和委派
- 委派模式的基本目的就是负责任务的调用和分配,和代理模式很像,可以看成是一个特殊的静态代理的全权代理
- 但是代理模式注重过程(),委派模式注重结果(老板不关注任务是怎么完成的,只管把任务交给经理让他去委派调度)。
- 代理模式中,代理类的被代理对象始终不变,而委派模式中委派类的被委托对象可以随时切换。
- 委派模式中委派类相当于全权代理,而不是像代理模式是部分代理
- 也有人理解为代理模式中二者是上下级关系,而委派模式中二者是平级关系
# 委派和策略:
委派往往是分派任务,这些任务往往并不是实现同一个功能 策略模式是选择策略,这些策略实现同一个功能,只是算法不同。
# 经验
要真正理解并掌握他们,完全抽象理解是不可行的。 我们需要阅读大量的代码,学习别人的设计实现,然后进行总结,才可以更加理解。 同样的,要掌握好,还需要我们亲自设计,编写大量的代码,不断的重构、优化,设计,总结,就能对此有更加深刻的理解,甚至是自己的一套经验。
# 案例
Spring中的DispatcherServlet DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制。这体现了委派模式。
而在DispatcherServlet中,又通过策略模式对流程每一部分选择具体的实现。
所以在实际开发中,往往都是多种设计模式的混合体运用。