设计模式之模版方法模式
模版模式是类的行为模式,将部分逻辑以具体方法来实现,将其他方法声明为抽象方法来让子类来实现。不同的子类实现的方法逻辑不同,从而整体的逻辑有所差异。
这里涉及到两个角色:
一、抽象模板(Abstract Template)角色有如下责任:
- 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,
它们是一个顶级逻辑的组成步骤。
- 定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,
而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。二、具体模板(Concrete Template)角色又如下责任:
- 实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。
- 每一个抽象模板角色都可以有任意多个具体模板角色与之对应,
而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,
从而使得顶级逻辑的实现各不相同。应用场景
实现不变的部分一次,并将其他留给子类来实现可能需要变化的行为。
- 需要简化代码,分离出公共的部分,抽离出一个公共的模板方法来替换所有的代码。
 - 控制子类扩展。定义在特定点调用“钩子”操作的模板方法,从而仅允许在那些点进行扩展。
 
模式结构
这里使用到模拟servlet中的httpServlet方法(简单的模拟方法中用到的模版方法)。定义一个公共的模版方法抽象类HttpServletTemplate,其中有两个钩子方法doGet和doPost,所谓的钩子方法就是需要由子类实现的方法。还有一个具体方法service来实现模版调用的作用。
模拟两个子类实现HttpServletTemplate实现两个钩子方法。
客户端App在调用的时候,直接调用两个子类的父类中的实现方法service实现调用模版。

代码
抽象模版类
1  | public abstract class HttpServletTemplate {  | 
具体模版类
1  | public class GetClient extends HttpServletTemplate {  | 
客户端调用
1  | public class App {  | 
其实模版方法模式是创建一个算法的骨架,具体的内容由子类去填充的这个过程。