1. 程式人生 > >java設計模式--模板方法模式

java設計模式--模板方法模式

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)行為由父類控制,由子類實現。

      缺點:

        模板方法模式顛倒了我們平常的設計習慣:抽象類負責宣告最抽象、最一般的事物屬性和方法,實現類實現具體的事物屬性和方法。在複雜的專案中可能會帶來程式碼閱讀的難度。