设计模式之模版方法模式
模版模式是类的行为模式,将部分逻辑以具体方法来实现,将其他方法声明为抽象方法来让子类来实现。不同的子类实现的方法逻辑不同,从而整体的逻辑有所差异。
这里涉及到两个角色:
一、抽象模板(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 { |
其实模版方法模式是创建一个算法的骨架,具体的内容由子类去填充的这个过程。