模板方法模式(TemplateMethod) 簡介

模板方法模式是一個相當簡單的模式.


可能1個完全不懂設計模式的程序猿在不知不覺間也多次使用了它.


我們先看看定義.


一.模板模式(TemplateMethod) 的定義.


所謂模板方法模式, 就是定義1個操作中的算法的骨架, 而將一些步驟延遲到子類中. 模板方法使得子類可以不改變1個算法的結構即可重定義該算法的某些特定步驟.


看了這麼多設計模式的定義, 這次終於是寫的比較通俗易懂了.


簡單來講,

模板方法模式把1個算法分成若干個步驟,    但是把這些步驟方法設爲抽象方法,  讓它們在子類中重寫.


這就有1個前提, 這個算法必須能嚴格分割成若干個步驟哦.



二. 洗衣機洗衣服的例子.

我們還是舉個例子來講.


洗衣機類 WashingMachine:

洗衣機最重要的方法就是洗衣服了(washing).


這個過程可以分成三個步驟

1. 進水 (inflow)
2. 清洗 (cleanning)

3. 脫水 (drying)


各種不同的洗衣機可能有不同的進水方法,  清洗方法 以及 脫水方法.

但是基本上都是可以分成上述三個步驟的.


所以我們可以把代碼寫成這樣.


public abstract class WashingMachine {
	public abstract void inflow();
	public abstract void cleaning();
	public abstract void drying();
	
	public void washing(){
		this.inflow();
		this.cleaning();
		this.drying();
	}
}

上面的代碼把三個子步驟寫成抽象方法,

而最終的washing()是非抽象方法.



兩個洗衣機子類: Siemens 和 Panasonic

兩個洗衣機的子類重寫了抽象類的三個抽象方法:

但是不重寫綜合算法.

public class Siemens extends WashingMachine  {

	@Override
	public void inflow() {
		// TODO Auto-generated method stub
		System.out.println("SIEMENS inflow.");
	}

	@Override
	public void cleaning() {
		// TODO Auto-generated method stub
		System.out.println("SIEMENS cleaning.");
	}

	@Override
	public void drying() {
		// TODO Auto-generated method stub
		System.out.println("SIEMENS cleaning.");
	}
	
}


public class Panasonic extends WashingMachine  {

	@Override
	public void inflow() {
		// TODO Auto-generated method stub
		System.out.println("Panasonic inflow.");
	}

	@Override
	public void cleaning() {
		// TODO Auto-generated method stub
		System.out.println("Panasonic cleaning.");
	}

	@Override
	public void drying() {
		// TODO Auto-generated method stub
		System.out.println("Panasonic cleaning.");
	}
	
}



客戶端代碼:

WashingMachine wm = new Siemens();
		wm.washing();
		
		wm = new Panasonic();
		wm.washing();

輸出:

SIEMENS inflow.
SIEMENS cleaning.
SIEMENS cleaning.
Panasonic inflow.
Panasonic cleaning.
Panasonic cleaning.

可以看出, 上面連個子類, 雖然它們的步驟是完全不同的, 但是它們洗衣服方法的骨架是一樣的.

UML:




三,小結

這個模式好易明,   無非就是把1個複雜算法拆解, 然後讓不同的子類自己去實現各個步驟.

它只適用於能分解步驟的算法.


子類一般只重寫步驟方法, 不重寫綜合骨架,

一旦子類重寫了骨架, 那麼它就不是模板方法(TemplateMethod)模式了.






































發佈了288 篇原創文章 · 獲贊 300 · 訪問量 63萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章