Template Method 模式

Template Method 模式即为模板方法模式。现实世界里很多事物也可以抽象成模板,在代码中的实现是将其抽象为一个抽象类,再用子类去继承该类,实现具体的抽象方法。

《图解设计模式》关于该设计模式的示例代码是将一个字符或字符串循环5次输出的一个例子。将会出现 AbstractDisplayCharDisplayStringDisplayMain 这四个类。Main 类用于测试我们的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//AbstractDisplay.java
package com.company;

public abstract class AbstractDisplay {

//交给子类去实现的抽象方法
public abstract void open ();
public abstract void print ();
public abstract void close ();

//抽象类实现的 display 方法
public final void display () {
this.open();

for( int i = 0; i < 5; ++i )
print();

this.close();
}
}

CharDisplay.java

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
//CharDisplay.java
package com.company;

public class CharDisplay extends AbstractDisplay {
private char ch;

public CharDisplay (char ch) {
this.ch = ch;
}

//三处重写了父类中的方法
@Override
public void open () {
System.out.print( ">>" );
}

@Override
public void print () {
System.out.print( ch );
}

@Override
public void close () {
System.out.print( "<<");
}
}

同样的套路,我们可以写出 StringDisplay.java 中的内容

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
//StringDisplay.java
package com.company;

public class StringDisplay extends AbstractDisplay {
private String str;
private int width;

public StringDisplay (String str) {
this.str = str;
this.width = str.getBytes().length;
}

private void printLine () {

System.out.print( "+" );

for ( int i = 0; i < this.width; ++i)
System.out.print( "-" );

System.out.println( "+" );
}

@Override
public void open () {
this.printLine();
}

@Override
public void print () {
System.out.println( "-" + this.str + "-" );
}

@Override
public void close () {
this.printLine();
}
}

最后在 Main 中测试我们的代码。

1
2
3
4
5
6
7
8
9
10
11
12
//Main.java
package com.company;

public class Main {

public static void main(String[] args) {
StringDisplay sd = new StringDisplay( "lang lang ago" );
CharDisplay cd = new CharDisplay( '+' );
sd.display();
cd.display();
}
}

输出的结果

模板模式体现了抽象类和具体类间的联系。同时也帮助我们理解了抽象类具体的使用情景。模板模式使得逻辑通用化,提高代码的复用。

参阅书目 《图解设计模式》