模板方法
Template 模式是采用继承的方式实现:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节。
Strategy 模式解决的是和 Template 模式类似的问题,但是 Strategy 模式是将逻辑(算法)封装到一个类中,并采取组合(委托) 的方式解决这个问题。
在开源项目中应用很多,继承某个Action抽象类,复写某个类似execute的方法,就完成了逻辑扩展。
策略模式
Strategy模式可以与工厂模式结合, Context 可以作为一个工厂,根据不同的 type 参数来生产不同的策略。这样就能在调用程序中避免使用条件语句来选择策略了。
可以看到 Strategy 模式和 Template 模式解决了类似的问题,也正如在 Template 模式中分析的, Strategy 模式和 Template 模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。
状态模式
将状态逻辑和动作实现进行分离。当一个操作中要维护大量的 case 分支语句,并且这些分支依赖于对象的状态。 State 模式将每一个分支都封装到独立的类中。
简单理解:比Strategy多了个state状态机维护在上下文中,每个状态倾向于有各自的状态行为实现XxxActionState,并changeState。
以上三个用法类似,多个行为共性较大,使用Template;共性低使用Strategy;有状态机,且状态行为都可以有自己的实现逻辑,使用State。
适配器模式
将一个类的接口转换成另一个接口。 Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
类模式的Adapter: 采用继承的方式复用Adaptee 的接口。
对象模式的Adapter: 采用组合的方式实现Adaptee 的复用。
代理模式
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。Proxy 模式最大的好处就是实现了逻辑和实现的彻底解耦。
简单区分适配器模式与代理模式
适配器倾向于直接适配接口服务的能力,代理倾向于代理对象,可以间接适配该对象的接口能力
装饰者模式
提供了一种给类增加额外职责的方法,不是通过继承实现的,而是通过组合。当系统需要新功能时,向旧的类中添加新的代码。把每个要装饰的功能放在单独的类中,并让这个类包装所要装饰的对象。因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。
包装器 Wrapper。 把所有功能按正确的顺序串联起来进行控制, 动态地给一个对象添加一些额外的职责。与生成子类相比, 更为灵活。
网友评论