Earth Guardian

You are not LATE!You are not EARLY!

0%

设计模式--行为型:模板方法模式

模板方法模式:定义一个操作中的算法的框架,而将详细的步骤延迟到子类中。模板方法使得子类可以不改变算法的结构下重新定义算法的步骤

模板方法模式 Template Pattern

一个算法可以明确分割为几个关键步骤,这几个步骤的顺序是固定的,但是每个步骤的实现会随环境的改变而变化,对于这类问题常用模板方法来解决。

类图结构

0061-TemplateMethod-uml-classdiag.png

结构解析

  • AbstractClass
    抽象类,定义一套算法框架 templateMethod
  • ConcreteClass
    实现类,实现抽象方法,在同一个算法框架下,体现每个实现类的差异性。

示例

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// 1. AbstractClass
public abstract class AbstractClass {
public abstract void privateOperation1();
public abstract void privateOperation2();
public abstract void privateOperation3();

public void templateMethod(){
System.out.println("AbstractClass: Game Start...");
privateOperation1();
privateOperation2();
privateOperation3();
}
}

// 2. ConcreteClass
public class ConcreteClassA extends AbstractClass{

@Override
public void privateOperation1() {
System.out.println("ConcreteClassA, WangZheRongYao: log in.");
}

@Override
public void privateOperation2() {
System.out.println("ConcreteClassA, WangZheRongYao: DaGuaiShengJi.");
}

@Override
public void privateOperation3() {
System.out.println("ConcreteClassA, WangZheRongYao: log out.");
}
}

public class ConcreteClassB extends AbstractClass{

@Override
public void privateOperation1() {
System.out.println("ConcreteClassA, DouDiZhu: log in.");
}

@Override
public void privateOperation2() {
System.out.println("ConcreteClassA, DouDiZhu: QiangDiZhu.");
}

@Override
public void privateOperation3() {
System.out.println("ConcreteClassA, DouDiZhu: log out.");
}
}

// 3. Test
public class TestTemplateMethod {
public static void main(String[] args) {
AbstractClass abstractClass = new ConcreteClassA();
abstractClass.templateMethod();

abstractClass = new ConcreteClassB();
abstractClass.templateMethod();
}
}

// 4. Result
AbstractClass: Game Start...
ConcreteClassA, WangZheRongYao: log in.
ConcreteClassA, WangZheRongYao: DaGuaiShengJi.
ConcreteClassA, WangZheRongYao: log out.
AbstractClass: Game Start...
ConcreteClassA, DouDiZhu: log in.
ConcreteClassA, DouDiZhu: QiangDiZhu.
ConcreteClassA, DouDiZhu: log out.

总结

模板方法模式是把不变行为搬移到父类,去除子类的重复代码,帮助子类摆脱重复不变行为的纠缠。常见使用场景:

  • 子类有共有方法,并且逻辑基本相同
  • 用于代码重构,将公共方法抽取到父类中

Android 中,Activity/Fragmengt 等的生命周期是标准的模板方法,以及 AsyncTask 的执行步骤 onPreExecute --> doInBackgroud --> onPostExecute 等这些都是模板方法的体现。

参考文档

  • 大话设计模式
  • Android 源码设计模式解析与实战