No.6 Template Method 模式
阿新 • • 發佈:2019-02-01
Template Method
顧名思義,就是說父類在其內部定義了一些抽象函式,然後定義了一個模板方法,並在模板方法中呼叫了這些抽象方法。父類在模板方法中定義了某個功能處理流程的框架,而子類則實現具體的處理。這個例子非常簡單,其核心的理念就是使邏輯處理通用化。
我們通過書中的一個簡單的例子來看一下Template Method
的具體實現方法:
首先,我們定義一個父類AbstarctDisplay.java
public abstract class AbstractDisplay {
abstract void open();
abstract void print();
abstract void close();
public final void display(){
open();
for (int i = 0 ; i < 5 ; i++){
print();
}
close();
}
}
其中,我們可以看出,該父類中定義了三個抽象函式,表示具體的功能細節在其子類中完成。並且定義了一個final
的具體函式,表示在display()
函式中,定義具體的流程。這樣的一個函式就稱為Template Method
.
其子類的實現以及呼叫如下所示:
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
void open() {
System.out.print("<<");
}
@Override
void print() {
System.out.print(ch);
}
@Override
void close( ) {
System.out.println(">>");
}
}
public class StringDisplay extends AbstractDisplay {
private String str;
public StringDisplay(String str) {
this.str = str;
}
@Override
void open() {
printTable();
}
@Override
void print() {
System.out.println("|" + this.str + "|");
}
@Override
void close() {
printTable();
}
void printTable(){
System.out.print("+");
for(int i = 0 ; i < this.str.length();i++){
System.out.print("-");
}
System.out.println("+");
}
}
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("你好,世界!");
AbstractDisplay d3 = new StringDisplay("Hello,World!");
d1.display();
d2.display();
d3.display();
}
}
輸出結果如下(由於含有中文以及Markdown顯示問題,表頭和底部的線沒有完全覆蓋文字):
<>
±-----+
|你好,世界!|
|你好,世界!|
|你好,世界!|
|你好,世界!|
|你好,世界!|
±-----+
±-----------+
|Hello,World!|
|Hello,World!|
|Hello,World!|
|Hello,World!|
|Hello,World!|
±-----------+
Template Method
設計模式實現十分的簡單,其核心內容就是在父類中實現一個具體的模板方法和一些抽象的方法,模板方法定義了具體的功能流程,而抽象方法需要在子類中進行實現 ,其具體的UML圖
在這裡就不贅述了。