模板方法模式
有多个相似的类,找到他们的共性,抽象出来,放入公共的抽象父类,作为模板。
策略模式
1.将算法封装成算法类,变抽象为形象(让不同的算法【抽象】,变成一个个算法策略【形象】)
2.将算法选择逻辑与算法本身解耦(由算法内部if-else代码级耦合【难以维护】,变为客户端选择算法类实例的耦合【灵活】)
不用策略模式:
1 | if(客户=="老客户"){ |
用策略模式:
1 | class OldCustomer implements Strategy{ |
客户端:
1 | Strategy strategy; |
二者关系
相似点:
没啥太大的相似点,之所以容易混淆,是因为在策略模式中,各个策略比较像,不同的策略类有可能包含同样的方法,这时候可以用模板方法模式构造这些策略类。
不同点:
既然没啥相似点,也不好说不同点。主要比较以下两点:1.实现方式 2.各模式强调了什么。
模板方法模式
- 用继承,模板是抽象父类
- 强调一个模板,让相似类有所管理
策略模式
- 用接口,各算法实现相应的策略接口
- 强调策略的形象性,不再操作抽象的算法,而是在客户端中根据情况不同直接选用不同策略。改变、扩展策略类,总比修改源代码中的if-else要优雅。