- 一文带你搞懂Java动态代理
- 几分钟带你搞懂策略模式
- 几分钟带你搞懂观察者模式
- 一文彻底搞明白工厂和抽象工厂
- 一文搞明白装饰者模式
- 最全单例模式
- 几段代码搞明白命令模式
- 几段代码搞明白适配器模式
- 一看就懂的外观模式
- 一看就懂的模版方法模式
关于模版方法模式的定义,我就直接引用Head First了:模版方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
这和前面说的策略模式很相似,但是策略模式是封装可替换的行为,然后使用组合的方式来决定采用哪一个行为,其意图是提供一组可替换的算法,让算法的变化独立于使用算法的客户,即用户可选择不同的算法。而我们的模版方法模式,是提供一个算法的大纲,而由子类来决定如何实现算法中的步骤,即用户可自行决定如何实现这套算法中的步骤,但却不能更换“不同的”算法。
模版方法模式
现在以线上购物流程为例,其大致步骤如下:
我们创建一个购物类,并将购物流程封装在一个方法内,这个方法就是模版方法模式里的“方法”二字了,细品下,为啥叫模版方法模式,而不是模版模式。我们可以将该方法使用 final 关键字修饰,以防止子类篡改算法模版。 能够注意到,该类是抽象类,其中包含 “下单” 和 “配送” 两个抽象方法,其意图就是由具体子类来决定实现的细节。不仅如此,“发货” 和 “收货” 两个方法,也体现了代码复用的思想。
public abstract class OnlineShopping {
final void shoppingProcess {
order(); // 下单
delivery() // 发货
distribution(); // 配送
receipt(); // 收货
}
// 下单
abstract void order();
// 卖家发货
void delivery() {
System.out.println("卖家发货");
}
// 配送中
abstract void distribution();
// 买家收货
void receipt() {
System.out.println("买家货");
}
}
来创建一个具体的某东商城购物类。JDShopping 实现了OnlineShopping 类的抽象方法,能够看出,我们并没有破坏掉算法模版,也没有改变算法的顺序,我们仅仅是给了某些步骤一些“符合自身”的具体的操作,即为某个步骤定义了不同的实现细节。
public class JDShopping extends OnlineShopping {
@Override void order() {
System.out.println("京东自营店铺下单");
}
@Override void distribution() {
System.out.println("使用京东快递配送");
}
}
同理,来创建一个具体的某宝商城购物类:
public class TBShopping extends OnlineShopping {
@Override void order() {
System.out.println("淘宝小店下单");
}
@Override void distribution() {
System.out.println("使用顺风快递配送");
}
}
我们来执行一段测试程序:
public class ClientTest {
public static void main(String[] ags) {
// 某东商城购物流程
JDShopping jd = new JDShopping();
jd.shoppingProcess();
// 某宝商城购物流程
TBShopping tb = new TBShopping();
tb.shoppingProcess();
}
}