一些常用設計模式的應用場景

創建型模式

構建者(builder)
當創建一個類的過程比較複雜時(例如要組合對象、以及判斷構造參數是否足夠和合法),用專門的類(如建立一個專門的Builder類)和方法將這個創建的過程封裝起來。

工廠方法(Factory Method)
給方法傳入類的名稱,方法給你返回你想要的類實例,現在這個模式的功能被spring框架IOC取代

抽象工廠(Abstract Factory)
抽象工廠模式與工廠方法模式的區別
可以這麼說,工廠方法模式是一種極端情況的抽象工廠模式,而抽象工廠模式可以看成是工廠方法模式的一種推廣。
(1)、其實工廠方法模式是用來創建一個產品的等級結構的,而抽象工廠模式是用來創建多個產品的等級結構的。工廠方法創建一般只有一個方法,創建一種產品。抽象工廠一般有多個方法,創建一系列產品。
(2)、工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。
簡而言之->
工廠方法模式:一個抽象產品類,可以派生出多個具體產品類。   
              一個抽象工廠類,可以派生出多個具體工廠類。   
              每個具體工廠類只能創建一個具體產品類的實例。   
抽象工廠模式:多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。   
              一個抽象工廠類,可以派生出多個具體工廠類。   
              每個具體工廠類可以創建多個具體產品類的實例。

典型應用:GUI工具箱,點擊工具箱中的每種工具類型時,使用不同的工廠類,在編輯界面上創建對應的組件對象

職責型模式

觀察者(observer)

當對象的狀態變化時,需要通知其他對象。使用observer模式,可以使解除通知的依賴關係,發生變化的類不需依賴接收通知的類。借用jdon的一個例子:產品價格和名稱發生變化時,需要通知到相關的用戶和商家,可以分別定義兩個observer類,在producet中包含一個observerList列表,在setName和setPrice方法中分別調用notifyObservers方法。Java的API還爲爲我們提供現成的Observer接口Java.util.Observer.我們只要直接使用它就可以.


職責鏈模式(chain of Responsibility)
接收GUI響應後(例如按幫助按鈕後),響應代碼的處理,可以自己處理,也可以將響應傳到下一個處理者。
java中的異常響應機制也是中這種模式,可以捕捉異常,或者將異常拋出到外面一層。

代理模式(Proxy)

處理跟外部系統或硬件交互時都用到,例如打印(只是調用打印類的方法,而不是直接調打印機接口)、例如發送JMS消息、導出excel、導入數據到其他系統(ERP),都會用一個代理類操作。

另外,代理的模式能夠在原來的方法上加入自己想要的邏輯。spring AOP就是使用了java的動態代理機制。


調停者(Mediator)
定義一個對象,將一組對象之間的交互封裝起來,從而降低對象間的耦合度,避免了對象間的顯式引用,並且可以獨立地改變對象行爲。

經常應用在界面控件的相關性操作中,例如選擇省份後,另一個下拉框顯示所有該省份的城市。

命令模式(command)
將調用封裝在一個對象中,而不是直接寫調用代碼,因爲設計時只知道在何時調用,而不知道具體執行什麼操作。
最經常使用在事件通知機制,例如flex中的EventListener。
在command模式中加入undo方法,也可以實現撤銷操作。
例如:工作流的畫圖工具。其中有一個具有一些按鈕的工具條,用戶可以通過這些按鈕去添加各種活動節點。用戶單擊了 Draw Activty(畫圓)按鈕,系統就創建一個 DrawActivityCommand 對象,並調用了該對象的 Execute()  方法,將一個活動圖標添加到畫圖編輯界面中,並且把這個command對象加入到私有變量(堆棧)中。用戶拖動製圖窗口中活動節點圖標,放開鼠標時,系統創建一個MoveActivityCommand 對象並執行Execute()  方法,同樣把這個command對象加入到私有變量(堆棧)中。
 隨後,用戶單擊了工具條上的 Undo 按鈕。系統彈出已完成命令棧棧頂的 Command 對象,並調用該對象的 Undo() 方法。接收到 Undo() 消息時,MoveActivityCommand對象從目標位置移動回到原來的位置,如果再次點解Undo 按鈕,則調用DrawActivityCommand的Execute()  方法,刪除畫圖編輯界面中的活動圖標。
備忘錄(Memento)
爲對象的狀態提供存儲和恢復的功能。同樣也可以實現撤銷操作,它比command模式實現撤銷功能的優勢是不用每次操作都創建一個command對象。

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