模板模式
定义:
模板模式,全称是模板方法设计模式(Template Method Design Pattern)。在GoF的《设计模式》一书中,它的定义是这样的:
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
翻译成中文就是:模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。
这里的“算法”,我们可以理解为广义上的“业务逻辑”,并不特指数据结构和算法里的“算法”。这里的算法骨架就是“模板”,包含算法骨架的方法就是“模板方法”,这也是模板方法模式名字的由来。
原理很简单,代码实现就更加简单,我写一个示例代码,如下所示:
1 | abstract class TemplateAbstractClass { |
程序输出如下:
1 | Template method |
模板模式作用一:复用
模板模式把一个算法中不变的流程抽象到父类的模板方法中,将可变的部分留给子类来实现。所有的子类都可以复用父类中模板方法定义的流程代码。
举个例子,比如我们做饭,一般分为以下几个步骤:
- 洗菜
- 切菜
- 炒菜
- 装盘
因为流程固定,我们可以把整个流程写在模板方法里,供子类复用(流程复用)。假设步骤1:洗菜 跟步骤4:装盘这两个步骤内容固定,切菜、炒菜可以自由选择刀具、厨具,那么固定步骤方法代码也可以复用,我先贴下示例代码:
1 | abstract class Cook{ |
运行结果如下:
1 | 洗菜 |
模板模式作用二:扩展
如果我们流程中需要插入其他步骤怎么办呢,也就是对流程进行扩展,其实很简单,只需要预留扩展点,代码如下:
1 | abstract class Cook{ |
输出如下:
1 | 洗菜 |
切鸡肉之前多加点鸡肉,煎完牛排休息五分钟,是不是很轻松的就把步骤扩展上去了,用户可以在不修改源码的情况下,基于扩展点定制化功能。