模板方法模式

“组件协作”模式

  • 现代软件专业分工之后的第一个结果是”框架与应用程序的划分”,”组件协作”模式是通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式
  • 典型模式分为:
    • Template Method(模板方法模式)
    • Strategy (策略模式)
    • Observe / Event (观察者模式)

模板方法模式

  • 在软件构建规程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因,而无法和任务的整体结构同时实现
  • 定义一个操作中的 算法骨架(稳定),而将一些步骤 延迟(变化) 到子类中.Template Method使得子类可以不改变(复用)一个算法的结构即可定义 (override重写) 该算法的某些特定步骤.

代码例子

第一种常见的处理方式

  • 1.程序任务整体操作结构比较稳定,都是从step1依次运行到step5
  • 2.子任务step1 step3 step5任务稳定 ; 子任务step2 step4不稳定,常常变化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Libary{

//稳定
public void step1(){
//步骤一...
}

//稳定
public void step3(){
//步骤三...
}

//稳定
public void step5(){
//步骤五...
}

}

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
class Application{
//变化
public boolean step2(){
//步骤二...
retuen 2;
}

//变化
public void step4(){
//步骤4...
}

public static void main(String args[]){
Library lib = new Library()
Application app = new Application();

//稳定
//步骤一
lib.step1;

//步骤二
if(app.step2){
//步骤三
lib .step3;
}

//步骤四
for(int i=0;i<4;i++)
app.step4;

//步骤五
lib.step5;


}

}
模板方法模式改造

  • Template Method模式是一种基础性设计模式,在面向对象系统中有大量的应用.用最简洁的机制(虚函数的多态性)为很多应用程序框架提供灵活的扩展点,是代码复用方面的基本实现
  • 除了可以灵活应对子步骤的变化外,反向控制结构是Template Method的典型应用(你不要调用我,让我来调用你)
  • 在具体实现方面,被TemplateMethod调用的虚方法可以有具体的实现,也可以没有任何实现(抽象方法,纯虚方法),但 一般推荐将其设置为protected方法.
    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
    abstract class Libary{

    //稳定
    protected void step1(){
    //步骤一...
    }

    //稳定
    protected void step3(){
    //步骤三...
    }

    //稳定
    protected void step5(){
    //步骤五...
    }

    //变化
    abstract boolean step2();
    abstract void step4();

    //稳定
    public void run(){ // Template Method
    //步骤一
    step1;

    //步骤二
    if(step2){ //支持变化 ===> 虚函数的多态调用
    //步骤三
    step3;
    }

    //步骤四
    for(int i=0;i<4;i++)
    step4;

    //步骤五
    step5;
    }


    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Application extend Libary{
//变化
@override
protected boolean step2(){
//步骤二...
retuen 2;
}

//变化
override
protected void step4(){
//步骤4...
}

public static void main(String args[]){

Libary lib = new Application(); //多态
lib.run();
}

}