模板方法模式和策略模式

模板方法模式

有多个相似的类,找到他们的共性,抽象出来,放入公共的抽象父类,作为模板。

策略模式

1.将算法封装成算法类,变抽象为形象(让不同的算法【抽象】,变成一个个算法策略【形象】)
2.将算法选择逻辑与算法本身解耦(由算法内部if-else代码级耦合【难以维护】,变为客户端选择算法类实例的耦合【灵活】)

不用策略模式:

1
2
3
4
5
6
if(客户=="老客户"){
price*=0.8;
}else if(客户=="大客户"){
price*=0.9;
}
return price;

用策略模式:

1
2
3
4
5
6
7
8
9
10
class OldCustomer implements Strategy{
public int getPrice(int price){
return price*0.8;
}
}
class BigCustomer implements Strategy{
public int getPrice(int price){
return price*0.9;
}
}

客户端:

1
2
3
4
5
6
7
Strategy strategy;
if(客户=="老客户"){
strategy = new OldCustomer();
}else if(客户=="大客户"){
strategy = new BigCustomer();
}
return strategy.getPrice(price);

二者关系

相似点:

没啥太大的相似点,之所以容易混淆,是因为在策略模式中,各个策略比较像,不同的策略类有可能包含同样的方法,这时候可以用模板方法模式构造这些策略类。

不同点:

既然没啥相似点,也不好说不同点。主要比较以下两点:1.实现方式 2.各模式强调了什么。

模板方法模式

  1. 用继承,模板是抽象父类
  2. 强调一个模板,让相似类有所管理

策略模式

  1. 用接口,各算法实现相应的策略接口
  2. 强调策略的形象性,不再操作抽象的算法,而是在客户端中根据情况不同直接选用不同策略。改变、扩展策略类,总比修改源代码中的if-else要优雅。