設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使代碼編製真正工程化,設計模式是軟體工程的基石,如同大廈的一塊塊磚石 ...
設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使代碼編製真正工程化,設計模式是軟體工程的基石,如同大廈的一塊塊磚石一樣。項目中合理的運用設計模式可以完美的解決很多問題,每種模式在現在中都有相應的原理來與之對應,每一個模式描述了一個在我們周圍不斷重覆發生的問題,以及該問題的核心解決方案,這也是它能被廣泛應用的原因。
1.設計模式的分類
創建型模式:
- Singleton,單例模式:保證一個類只有一個實例,並提供一個訪問它的全局訪問點。
- Abstract Factory,抽象工廠:提供一個創建一系列相關或相互依賴對象的介面,而無須指定它們的具體類。
- Factory Method,工廠方法:定義一個用於創建對象的介面,讓子類決定實例化哪一個類,Factory Method使一個類的實例化延遲到了子類。
- Builder,建造模式:將一個複雜對象的構建與他的表示相分離,使得同樣的構建過程可以創建不同的表示。
- Prototype,原型模式:用原型實例指定創建對象的種類,並且通過拷貝這些原型來創建新的對象。
行為型模式:
- Iterator,迭代器模式:提供一個方法順序訪問一個聚合對象的各個元素,而又不需要暴露該對象的內部表示。
- Observer,觀察者模式:定義對象間一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知自動更新。
- Template Method,模板方法:定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,TemplateMethod使得子類可以不改變一個演算法的結構即可以重定義該演算法得某些特定步驟。
- Command,命令模式:將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進行參數化,對請求排隊和記錄請求日誌,以及支持可撤銷的操作。
- State,狀態模式:允許對象在其內部狀態改變時改變他的行為。對象看起來似乎改變了他的類。
- Strategy,策略模式:定義一系列的演算法,把他們一個個封裝起來,並使他們可以互相替換,本模式使得演算法可以獨立於使用它們的客戶。
- China of Responsibility,職責鏈模式:使多個對象都有機會處理請求,從而避免請求的送發者和接收者之間的耦合關係
- Mediator,中介者模式:用一個中介對象封裝一些列的對象交互。
- Visitor,訪問者模式:表示一個作用於某對象結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用於這個元素的新操作。
- Interpreter,解釋器模式:給定一個語言,定義他的文法的一個表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
- Memento,備忘錄模式:在不破壞對象的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個狀態。
結構型模式:
- Composite,組合模式:將對象組合成樹形結構以表示部分整體的關係,Composite使得用戶對單個對象和組合對象的使用具有一致性。
- Facade,外觀模式:為子系統中的一組介面提供一致的界面,fa?ade提供了一高層介面,這個介面使得子系統更容易使用。
- Proxy,代理模式:為其他對象提供一種代理以控制對這個對象的訪問
- Adapter,適配器模式:將一類的介面轉換成客戶希望的另外一個介面,Adapter模式使得原本由於介面不相容而不能一起工作那些類可以一起工作。
- Decrator,裝飾模式:動態地給一個對象增加一些額外的職責,就增加的功能來說,Decorator模式相比生成子類更加靈活。
- Bridge,橋模式:將抽象部分與它的實現部分相分離,使他們可以獨立的變化。
- Flyweight,享元模式
2.模板方法Template Method
概述
模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。 比如定義一個操作中的演算法的骨架,將步驟延遲到子類中。模板方法使得子類能夠不去改變一個演算法的結構即可重定義演算法的某些特定步驟。模式中的角色
抽象類(AbstractClass):實現了模板方法,定義了演算法的骨架。 具體類(ConcreteClass):實現抽象類中的抽象方法,已完成完整的演算法。設計舉例
1 //抽象模板 2 public abstract class AbstractClass 3 { 4 protected abstract void doAnyting(); 5 6 protected abstract void doSomething(); 7 8 public void templateMethod() 9 { 10 doAnyting(); 11 doSomething(); 12 } 13 } 14 15 public class ConcreteClass1 extends AbstractClass 16 { 17 @Override 18 protected void doAnyting() 19 { 20 System.out.println("do class1 anything"); 21 } 22 23 @Override 24 protected void doSomething() 25 { 26 System.out.println("do class1 something"); 27 } 28 } 29 30 public class ConcreteClass2 extends AbstractClass 31 { 32 @Override 33 protected void doAnyting() 34 { 35 System.out.println("do class2 anything"); 36 } 37 38 @Override 39 protected void doSomething() 40 { 41 System.out.println("do class2 something"); 42 } 43 } 44 45 public class Client 46 { 47 public static void main(final String[] args) 48 { 49 final AbstractClass c1 = new ConcreteClass1(); 50 final AbstractClass c2 = new ConcreteClass2(); 51 c1.templateMethod(); 52 c2.templateMethod(); 53 } 54 }