目的算法
- 建立型(Creational)模式
將對象的部分建立工做延遲到子類或者其餘對象,從而應對需求變化爲對象建立時具體類型實現引來的衝擊。- 結構型(Structural)模式
經過類繼承或者對象組合得到更靈活的結構,從而應對需求變化爲對象的結構所帶來的衝擊。- 行爲型(Behavioral)模式
經過類繼承或者對象組合來劃分類與對象間的職責,從而應對需求變化爲多個交互的對象所帶來的衝擊。
範圍- 類模式處理類與子類的靜態關係。
- 對象模式處理對象間的動態關係。
組件協做 | 對象性能 | 數據結構 | |||
---|---|---|---|---|---|
Template Method | Singleton | Composite | |||
Strategy | Flyweight | Lterator | |||
Observer/Event | Chain of Resposibility |
單一職責 | 行爲變化 | 狀態變化 | |||
---|---|---|---|---|---|
Decorator | Command | State | |||
Bridge | Visitor | Memento |
接口隔離 | 對象建立 | 領域問題 | |||
---|---|---|---|---|---|
Facade | Factory Method | Interpreter | |||
Proxy | Abstract Factory | ||||
Adapter | Prototype | ||||
Mediator | Builder |
- 面向對象設計模式是
好的面向對象設計
,所謂好的面向對象設計
指的是那些能夠知足應對變化,提升複用
的設計。- 現代軟件設計的特徵是
需求的頻繁變化
,設計模式的要點是尋求變化點,而後在變化點處應用設計模式,從而來更好地應對需求的變化
.何時,什麼地點應用設計模式
比理解設計模式結構自己
更爲重要。- 設計模式的應用不宜先入爲主,沒有一步到位的設計模式,敏捷軟件開發實踐提倡的
Refactoring to Patterns
是目前公認的最好的使用設計模式的方法。
- 靜態->動態
- 早綁定->晚綁定
- 繼承->組合
- 編譯時依賴->運行時依賴
- 緊耦合->鬆耦合
- 現代軟件專業分工以後的第一個結果是:「框架與應用程序的劃分」,「組件協做」模式經過晚期綁定,來實現框架與應用程序之間的鬆耦合,是兩者之間協做時經常使用的模式。
- 典型模式
Template Method
Strategy
Observer/Event
Tremplate Method模板方法
動機:在軟件的構建過程當中,對於某一項任務,他經常有穩定的總體操做結構,但各個子步驟卻有不少改變的需求,或者因爲固有的緣由(好比框架與應用之間的關係)而沒法和任務的總體結構同事實現。
設計要求設計模式
步驟數據結構
源碼:app
//程序庫開發人員
classLibrary{
//穩定
publicvoid step1(){//...
}
//穩定
publicvoid step3(){//...
}
//穩定
publicvoid step5(){//...
}
}
//應用程序開發人員
classApplication{
//變化
publicboolean step2(){//...
returntrue;
}
//變化
publicvoid step4(){//...
}
//穩定
publicstaticvoid main(String args[]){
Library lib =newLibrary();
Application app =newApplication();
lib.step1();
if(app.step2()){
lib.step3();
}
for(int i =0; i <4; i++){
app.step4();
}
lib.step5();
}
}
步驟框架
源碼:ide
//程序庫開發人員
abstractclassLibrary{
publicvoid run(){//穩定 template method
step1();
if(step2()){//支持變化 ==> 虛函數的多態調用
step3();
}
for(int i =0; i <4; i++){
step4();//支持變化 ==> 虛函數的多態調用
}
step5();
}
protectedvoid step1(){//穩定 //...
}
protectedvoid step3(){//穩定 //...
}
protectedvoid step5(){//穩定 //...
}
abstractboolean step2();//變化
abstractvoid step4();//變化
}
//應用程序開發人員
classApplicationextendsLibrary{
@Override
protectedboolean step2(){//... 子類重寫實現
returntrue;
}
@Override
protectedvoid step4(){//... 子類重寫實現
}
publicstaticvoid main(String args[]){
Library lib =newApplication();
lib.Run();
}
}
不要強調自我,讓我來調用你
的反向控制結構是Template Method的典型應用。