1. 程式人生 > >《Head.First設計模式》的學習筆記(11)--模板方法模式

《Head.First設計模式》的學習筆記(11)--模板方法模式

意圖:在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

結構:



 

其中AbstractClass 實現為:

public abstract class AbstractClass {
	
	final void templateMethod(){
		primitiveOperation1();
		primitiveOperation2();
		concreteOperation();
		hook();//鉤子
	}
	
	abstract void primitiveOperation1();
	
	abstract void primitiveOperation2();
	
	final void concreteOperation(){
		//這裡是實現
	}
	void hook(){
		
	}
}

先看我們一個例子,我們要進行泡茶和泡咖啡,我們會如何進行操作:

咖啡:

1.把水煮沸

2.用沸水沖泡咖啡粉

3.把咖啡倒進杯子

4.加糖和咖啡

public class Coffee {
	
	void prepareRecipe(){
		boilWater();
		brewCoffeeGrinds();
		pourInCup();
		addSugarAndMilk();
	}
	
	public void boilWater(){
		System.out.println("Boiling Water");
	}
	
	public void brewCoffeeGrinds(){
		System.out.println("Dripping Coffee through filter");
	}
	
	public void pourInCup(){
		System.out.println("Pouring into cup");
	}
	
	public void addSugarAndMilk(){
		System.out.println("Adding Sugar and Milk");
	}
}

茶:

1.把水煮沸

2.用沸水浸泡茶葉

3.把茶倒進杯子

4.加檸檬

public class Tea {
	void prepareRecipe(){
		boilWater();
		steepTeaBag();
		pourInCup();
		addLemon();
	}
	
	public void boilWater(){
		System.out.println("Boiling Water");
	}
	
	public void steepTeaBag(){
		System.out.println("Steeping the tea");
	}
	
	public void pourInCup(){
		System.out.println("Pouring into cup");
	}
	
	public void addLemon(){
		System.out.println("Adding Lemon");
	}
}

我們會發現其實有相同的方法,我們將其抽象化,其實我們發現咖啡的brewCoffeeGrinds()和茶的steepTeaBag()其實都是泡的動作,然後在發現咖啡的addSugarAndMilk()和茶的addLemon()都是加原料的動作,我們可以將這兩個動作brew()和addCondiments()方法,我們將其程式碼寫出:

public abstract class CaffeineBeverage {
  
	final void prepareRecipe() {
		boilWater();
		brew();
		pourInCup();
		addCondiments();
	}
 
	abstract void brew();
  
	abstract void addCondiments();
 
	void boilWater() {
		System.out.println("Boiling water");
	}
  
	void pourInCup() {
		System.out.println("Pouring into cup");
	}
}

 brew()方法和addCondiments()方法由子類方法延遲實現。

   上面有一個hook()方法,我們到底何時使用鉤子這個方法呢?就是一些步驟進行可以選擇的時候。

   下面我們將介紹模板方法和策略模式的一些不同點:

1.模板方法使用的繼承模式,策略模式使用的是物件組合模式。

2.模板方法依賴度比策略高。

總結:

1.為防止子類修改模板方法的演算法,可以將模板方法宣告為final.

2.其中模板方法模式運用了好萊塢原則。

3.策略模式和模板方法模式都封裝了演算法,但是模板方法模式使用繼承,而策略模式使用物件組合模式。

4.其實工廠方法是一種特殊的模板方法的版本。

相關推薦

Head.First設計模式》的學習筆記11模板方法模式

意圖:在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。 結構:   其中AbstractClass 實現為: public abstract class AbstractClass {

Head First設計模式學習筆記-------12狀態模式

我們今天開門見山吧,我們又接到了一個新的專案,讓我們看看這次的專案是什麼吧 對於大家學了熟練的開發技巧,看到這麼一個專案,是不是內心第一個想法就是------真TM簡單。 public class GumballMachine { final static int

設計模式學習筆記 設計基本原則之【單一職責原則】

code 分享 開發者 實際應用 需要 ret ext file類 tor 單一職責原則(SRP: Single Responsibility Principle) 名詞解釋: 1) 職責:是指類變化的原因。 2) 職責擴散:就是因為某種原因,職責P被分化為粒度更細的職責P

設計模式學習筆記--簡單工廠模式和工廠模式

bsp bubuko rac oid nds gen body () pri 老生長談的兩個設計模式了,這裏把這兩個設計模式對比著來總結一下。 什麽是簡單工廠模式? 簡單工廠模式:根據傳入工廠類的參數動態決定要創建哪一個產品類的實例。 UML圖如下(以實現一個計算器為例):

設計模式學習筆記--適配器模式Adapter

rac code 建立 system 代碼復用 static 筆記 計算 希望 什麽叫適配器模式?將一個接口轉換成客戶希望的另外一個接口,Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。 該模式主要用於希望復用一些現存的類(這些類的數據和行為都正

設計模式學習筆記——策略模式

count forname tst code tchar 類名 適用於 動態 自由 一、概述   策略模式屬於對象的行為模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們之間可以互相替換。策略模式使得算法可以在不影響客戶端的情況下發生變化。

設計模式學習筆記1

設計模式是一套被反覆使用的、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 設計模式主要是基於以下的面向物件設計原則。 對介面程式設計而不是對實現程式設計。 優先使用物件組合而不是繼承。  

java設計模式學習筆記 --- 行為型模式

文章目錄 責任鏈模式 策略模式 命令模式 直譯器模式 迭代器模式 中介者模式 備忘錄模式 觀察者模式 狀態模式 模板方法模式 訪問者模式 責任鏈模式 我獲取了一個物件,現在需要根據物件

java設計模式學習筆記--- 結構型模式

文章目錄 介面卡模式 組合模式 裝飾模式 代理模式 什麼時候使用代理模式 享元模式 外觀模式(門面模式) 橋樑模式 介面卡模式 介面卡是一個介面轉換器,用於在接收不同的輸入時,得到一致

java設計模式學習筆記--- 建立型模式

文章目錄 簡介 設計模式所遵循的幾個原則 一、工廠方法模式 簡單工廠模式 工廠方法模式 抽象工廠模式 工廠模式小結 單例模式 單例模式小結 建造者模式

JAVA設計模式學習筆記

2018年11月03日 12:14:18 築夢^_^ 閱讀數:6 個人分類: JAVA

java/android 設計模式學習筆記10---建造者模式

  這篇部落格我們來介紹一下建造者模式(Builder Pattern),建造者模式又被稱為生成器模式,是創造性模式之一,與工廠方法模式和抽象工廠模式不同,後兩者的目的是為了實現多型性,而 Builder 模式的目的則是為了將物件的構建與展示分離。Builder

java/android 設計模式學習筆記15---責任鏈模式

  這篇部落格我們來介紹一下責任鏈模式(Chain-of-responsibility Pattern),責任聯模式又稱為職責鏈模式,是行為型設計模式之一。顧名思義,責任鏈模式中存在一個鏈式結構,多個節點首尾相連,每個節點都可以被拆開再連線,因此,鏈式結構具有很

java/android 設計模式學習筆記20---迭代器模式

  我們這篇部落格來介紹一下迭代器模式(Iterator Pattern),又稱為遊標(Cursor Pattern)模式,是行為型設計模式之一。迭代器模式算是一個比較古老的設計模式,其源於對容器的訪問,比如 Java 中的 List、Map、陣列等,我們知道對

java 設計模式 學習筆記17 橋接模式

 橋接模式:           將抽象部分與它的實現部分分離,使他們多可以獨立的變化。抽象與實現分離,表示抽象類和他的派生類用來實現自己的物件。        在系統中,可能有多角度分類,每一種分類都有可能變化,這時就把這種多角度分離出來讓他們獨立變化,減少各個角度的耦合。

java/android 設計模式學習筆記12---組合模式

  這篇我們來介紹一下組合模式(Composite Pattern),它也稱為部分整體模式(Part-Whole Pattern),結構型模式之一。組合模式比較簡單,它將一組相似的物件看作一個物件處理,並根據一個樹狀結構來組合物件,然後提供一個統一的方法去訪問相

設計模式學習筆記單例模式

單例模式(Singleton Pattern): Ensure a class has only one instance, and provide a global point of access to it. (確保某一個類只有一個例項,並向整個系統提供這個例項的

java 設計模式 學習筆記16 單例模式

單例模式:保證一個類僅有一個例項,並提供一個訪問其例項的一個全域性訪問點 根據單例模式的定義,寫一個單例模式的例子需要注意兩點: 1.例項有該類自己生成      為了防止客戶程式碼通過 new Singleton()來例項一個物件,需要將 Singleton的預設建構函式

設計模式學習筆記3:觀察者模式2

       上一篇的觀察者模式的筆記中提到的例子,只是Subject把自身狀態“推”給Observer的方式。 //通知觀察者資訊發生改變了 @Override public void notifyObservers() { for (

Linux第一周學習筆記11

read indent rect 目錄 普通 -s x86-64 筆記 講解 Linux第一周學習筆記(11)2.1系統目錄結構(上)2.2系統目錄結構(下)接下來的課程開始講解Linux系統的命令與具體用法(1) ls(list)命令:用來列取系統的目錄或者是