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

模板方法模式:java

在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模版方法使子類在不改變算法結構的狀況下,從新定義算法中的某些步驟。算法

模板方法模式的結構:框架

  • 抽象類:實現了模板方法,定義了算法的骨架。
  • 具體類:實現抽象類中的抽象方法,已完成完整的算法。

這個模式是用來建立一個算法的模板。這個模板將算法定義爲一組步驟,其中任何步驟均可以是抽象的,由子類負責實現。不少框架都是採用模板方法模式。spa

示例:星巴茲沖泡咖啡和茶的步驟以下:code

咖啡沖泡法:繼承

  1. 把水煮沸
  2. 用沸水沖泡咖啡
  3. 把咖啡倒進杯子
  4. 加糖和牛奶

茶沖泡法:ip

  1. 把水煮沸
  2. 用沸水浸泡茶葉
  3. 把茶倒進杯子
  4. 加檸檬

首先定義一個飲料的抽象類:ci

public abstract class Drink {
    //模板方法,定義製做飲料的模板過程
	final void makeDrink() {
		boilWater();    //煮水
		brew();    //沖泡
		pourInCup();    //倒進杯子
		if (customerWantsCondiments()) {
			addCondiments();    //加配料
		}
	}
    //各類飲料的沖泡方法和加配料方法不一樣,定義爲抽象方法交給子類實現
	abstract void brew();
	abstract void addCondiments();    
    //各類飲料煮水和倒進杯子方法都同樣,直接在抽象超類中實現
	void boilWater() {	System.out.println("Boiling water");}    
	void pourInCup() {	System.out.println("Pouring into cup");}
    //該方法是一個鉤子,子類能夠覆蓋該鉤子來實現一些自定義功能
	boolean customerWantsCondiments() {
		return true;
	}
}

而後定義咖啡和茶類:鉤子

//茶類
public class Tea extends Drink{
    public void brew(){  System.out.println("steeping the tea"); }
    public void addCondiments(){  System.out.println("adding lemon"); }
}
//咖啡類
public class Coffee extends Drink{
    public void brew(){  System.out.println("dripping coffee through filter");}
    public void addCondiments(){ System.out.println("adding sugar and milk");}
}

要點:table

  • 模板方法定義了算法的步驟,把這些步驟的實現延長到子類。
  • 模板方法模式爲咱們提供了一種代碼複用的重要技巧。
  • 模板方法的抽象類能夠定義具體方法、抽象方法和鉤子。
  • 抽象方法由子類實現。
  • 爲了防止子類改變模板方法中的算法,可將模板方法聲明爲final.
  • 策略模式和模板方法模式都封裝算法,一個用組合,一個用繼承。
  • 工廠方法是模板方法的一種特殊版本。
相關文章
相關標籤/搜索