设计模式之模版模式

设计模式之模版方法模式

模版模式是类的行为模式,将部分逻辑以具体方法来实现,将其他方法声明为抽象方法来让子类来实现。不同的子类实现的方法逻辑不同,从而整体的逻辑有所差异。

这里涉及到两个角色:

一、抽象模板(Abstract Template)角色有如下责任:

- 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,
它们是一个顶级逻辑的组成步骤。

- 定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,
而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。

二、具体模板(Concrete Template)角色又如下责任:

- 实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。

- 每一个抽象模板角色都可以有任意多个具体模板角色与之对应,
而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,
从而使得顶级逻辑的实现各不相同。

应用场景

实现不变的部分一次,并将其他留给子类来实现可能需要变化的行为。

  • 需要简化代码,分离出公共的部分,抽离出一个公共的模板方法来替换所有的代码。
  • 控制子类扩展。定义在特定点调用“钩子”操作的模板方法,从而仅允许在那些点进行扩展。

模式结构

这里使用到模拟servlet中的httpServlet方法(简单的模拟方法中用到的模版方法)。定义一个公共的模版方法抽象类HttpServletTemplate,其中有两个钩子方法doGetdoPost,所谓的钩子方法就是需要由子类实现的方法。还有一个具体方法service来实现模版调用的作用。

模拟两个子类实现HttpServletTemplate实现两个钩子方法。

客户端App在调用的时候,直接调用两个子类的父类中的实现方法service实现调用模版。

模版模式结构

代码

抽象模版类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public abstract class HttpServletTemplate {

public void service(HttpRequestMethod method){
if(method.equals(HttpRequestMethod.METHOD_GET)){
System.out.println("so something 1");
doGet();
System.out.println("so something 2");
}else if(method.equals(HttpRequestMethod.METHOD_POST)){
doPost();
}else {
System.out.println("do nothing!");
}
}
protected void doGet(){};

protected void doPost(){};
}

具体模版类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class GetClient extends HttpServletTemplate {
@Override
protected void doGet() {
System.out.println("this is my get methods!");
}
}
public class PostClient extends HttpServletTemplate {
@Override
protected void doGet() {
this.doPost();
}

@Override
protected void doPost() {
System.out.println("this is my post methods!");
}
}
// 请求类型枚举类
public enum HttpRequestMethod {
METHOD_GET,METHOD_POST,METHOD_DELETE
}

客户端调用

1
2
3
4
5
6
7
8
9
10
11
public class App {
public static void main(String[] args) {
//声明post客户端
PostClient post = new PostClient();
//调用模版
post.service(HttpRequestMethod.METHOD_POST);
GetClient get = new GetClient();
get.service(HttpRequestMethod.METHOD_GET);
get.service(HttpRequestMethod.METHOD_POST);
}
}

其实模版方法模式是创建一个算法的骨架,具体的内容由子类去填充的这个过程。

-------------本文结束感谢您的阅读-------------

本文标题:设计模式之模版模式

文章作者:NanYin

发布时间:2019年06月17日 - 12:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/06/17/2019-06-17-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E6%A8%A1%E7%89%88%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。