Template method pattern
從這個模式的名字就可以知道個大概,Template說明這個模式有一個模版,子類都要按照父類列出的大綱來干活。在這個模式中,父類通常是abstract的。為什么不用接口?因為對某些所有子類都要用到的方法,父類中就給出了代碼,而接口中是不能有具體實現代碼的。
父類中有一個總的方法就是所謂的template method,這個方法通常被聲明為final,這樣子類就無法override它,保證了它的權威性。這個template method調用其它方法,這些“其它方法”包括了三個類型:
第一種,是abstract類型,子類需要根據自己的情況實現這部分代碼;
第二種,是final型的,這種方法父類把它寫死了,子類必須遵守;
第三種,就是普通方法,是optional的,子類可以延用父類的方法,也可以override掉它,寫自己的代碼,這種optional的方法給它一個名字叫做hook。
這個父類通常是這種形勢。
abstract class AbstractClass{
final void templateMethod(){
a();
b();
c();
…
}
abstract void a();
final void b(){}
void c(){}
}
應該說這個模式既蘊含著權威性和自由性。
Iterator and Composite Patterns
這個模式的研究對象是Collection,包括ArrayList、Array甚至還有Hashmap等等一切java里面的集合對象。Iterator的理念是把集合對象中的遍歷等功能獨立抽取出來,實現一個Iterator的接口,主要實現next()和hasNext()兩個方法,這些東西和數據結構里面的東西基本一樣。
而以此為基礎的Composite Pattern其實就是數據結構里面樹的概念,所以這里的東西還是找本數據結構書看看更好。
The State Pattern
初看這個模式,發現里面有一個類似UML中狀態圖的東西,如其名字,這個模式主要描述如何處理應用中出現的“狀態”。
解決方式是這樣的:
. 第一步,創建一個叫做State的接口,里面包含什么東西呢?記得UML狀態圖中發生狀態轉換時箭頭上面那些改變的條件?把這些條件全部轉化為方法,表示當這個條件發生時,狀態該怎么變。
第二步,每個具體的concreteState都要實現都要實現State這個接口。怎么實現?當然,state不是獨立出現的,總有一個把它作為參數的類,里面有個私有變量保存當前的狀態,暫且就把它稱作currentState吧。接口中定義的方法,在concreteState中這樣實現:每個方法根據條件定義,將currentState改成相應的狀態。
以上其實就是State Pattern的精髓。