java設計模式--模板方法模式
阿新 • • 發佈:2018-12-04
1 簡介
定義一個模板結構,將具體內容延遲到子類去實現。它主要作用:在不改變模板結構的前提下在子類中重新定義模板中的內容。
主要兩點
1 提高程式碼複用性
將相同部分的程式碼放在抽象的父類中,而將不同的程式碼放入不同的子類中
2 實現了反向控制
通過一個父類呼叫其子類的操作,通過對子類的具體實現擴充套件不同的行為,實現了反向控制 & 符合“開閉原則”
例項:
我們試卷現在都是,試題和答卷是分開的,因為試題我們都是一樣的,而我們的答案就各自有各自的答案
UML
對他非常簡單,主要就是通過繼承實現。
程式碼:
package com.sl.demo.templet; /** * 題目模型 * 現在有三道選擇題 * @author pengkun * */ public abstract class Questions { //名字(不管試卷還是答題卡都會有名字) private String name; public void setName(String name) { this.name = name; } //三道題目 private void createQuestions1() { System.out.println("面向物件的特性不包括? A封裝 B繼承 C多型 D訊息通訊"); } private void createQuestions2() { System.out.println("<大話設計模式>這本書的作者是誰? A張三 B李四 C程傑 D都不是"); } private void createQuestions3() { System.out.println("<this girl>這首歌是被哪個人唱到收費的? A一個小學生 B一個初中生 C一個高中生 D一個大學生"); } //開始出題了(final:防止被覆蓋 模板方法 ) final public void run() { System.out.println("姓名:"+this.name); this.createQuestions1(); System.out.println(getAnswer1()); this.createQuestions2(); System.out.println(getAnswer2()); this.createQuestions3(); System.out.println(getAnswer3()); } //1題答案(預設沒填) protected String getAnswer1() { return ""; } //2題答案(預設沒填) protected String getAnswer2() { return ""; } //3題答案(預設沒填) protected String getAnswer3() { return ""; } }
package com.sl.demo.templet;
/**
* 學生答題卡
* @author pengkun
*
*/
public class AnswerCard extends Questions {
//答題卡三道題答案
private String Answer1;
private String Answer2;
private String Answer3;
public void setAnswer1(String answer1) {
Answer1 = answer1;
}
public void setAnswer2(String answer2) {
Answer2 = answer2;
}
public void setAnswer3(String answer3) {
Answer3 = answer3;
}
//覆蓋父類答案(其實這就是鉤子方法,具體答案讓子類來實現)
@Override
protected String getAnswer1() {
return Answer1;
}
@Override
protected String getAnswer2() {
return Answer2;
}
@Override
protected String getAnswer3() {
return Answer3;
}
}
測試:
@Test
public void test() {
//第一個同學
AnswerCard stu1=new AnswerCard();
stu1.setName("張三");
stu1.setAnswer1("D");
stu1.setAnswer2("C");
stu1.setAnswer3("B");
//第二個同學我就什麼都不會,我全選B
AnswerCard stu2=new AnswerCard();
stu2.setName("李四");
stu2.setAnswer1("B");
stu2.setAnswer2("B");
stu2.setAnswer3("B");
//開始作答
stu1.run();
stu2.run();
}
結果:
姓名:張三
面向物件的特性不包括? A封裝 B繼承 C多型 D訊息通訊
D
<大話設計模式>這本書的作者是誰? A張三 B李四 C程傑 D都不是
C
<this girl>這首歌是被哪個人唱到收費的? A一個小學生 B一個初中生 C一個高中生 D一個大學生
B
姓名:李四
面向物件的特性不包括? A封裝 B繼承 C多型 D訊息通訊
B
<大話設計模式>這本書的作者是誰? A張三 B李四 C程傑 D都不是
B
<this girl>這首歌是被哪個人唱到收費的? A一個小學生 B一個初中生 C一個高中生 D一個大學生
B
模板方法模式的優缺點
優點:
1)封裝不變部分,擴充套件可變部分:把認為不變部分的演算法封裝到父類實現,可變部分則可以通過繼承來實現,很容易擴充套件。
2)提取公共部分程式碼,便於維護
3)行為由父類控制,由子類實現。
缺點:
模板方法模式顛倒了我們平常的設計習慣:抽象類負責宣告最抽象、最一般的事物屬性和方法,實現類實現具體的事物屬性和方法。在複雜的專案中可能會帶來程式碼閱讀的難度。