设计模式-模板方法模式

设计模式-模板方法模式

模板方法模式(Template Method)

  • 动机:对于一项任务,常常有稳定的整体操作结构,但各个子步骤却又很多改变的需求,或者需要子步骤的晚期实现(延迟到子类去实现)。
  • Template Method使得子类可以复用一个算法的结构Override 重写)该算法的某些特定步骤。
  • 不要调用我,让我来调用你,实现晚绑定机制这也就是控制反转的思想。
  • 声明成 protected ,因为具体步骤在流程中才有意义。

mark

  • AbstractClass : 稳定的骨架(里面有具体的方法和需要被重写的方法)
  • ContreteClass : 具体的重写方法

模板方法模式定义(特别的常用):

  • 定义一个操作中的算法的骨架(稳定) ,而将一些步骤(变化)延迟到子类中。
  • Template Method 使得子类可以不改变(复用)一个算法的结构即可(Override 重写)该算法某些特定的步骤
  • 具体实现(举例)

冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,要求复用那些相同步骤的代码。

mark

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public abstract class AbstractClass {

// 骨架流程
final void prepareRecipe(){
boilWater();
brew();
pourIncoup();
addCondiments();
}

// 待重写的方法
abstract void brew();

// 待重写的方法
abstract void addCondiments();


void pourIncoup() {
System.out.println("倒进杯子");
}

void boilWater() {
System.out.println("倒水");
}

}
1
2
3
4
5
6
7
8
9
public class Coffee extends AbstractClass {
void brew() {
System.out.println("倒咖啡");
}

void addCondiments() {
System.out.println("加入咖啡粉");
}
}
1
2
3
4
5
6
7
8
9
public class Tea extends AbstractClass {
void brew() {
System.out.println("倒茶");
}

void addCondiments() {
System.out.println("加入茶叶");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
public class Client {
public static void main(String[] args) {
AbstractClass coffee = new Coffee();
coffee.prepareRecipe();

System.out.println("========");


AbstractClass tea = new Tea();
tea.prepareRecipe();
}
}

结果显示:

1
2
3
4
5
6
7
8
9
倒水
倒咖啡
倒进杯子
加入咖啡粉
========
倒水
倒茶
倒进杯子
加入茶叶

JDK中实现:

  • java.util.Collections#sort()
  • java.io.InputStream#skip()
  • java.io.InputStream#read()
  • java.util.AbstractList#indexOf()
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信