1. 程式人生 > >一些常用設計模式的應用場景

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

建立型模式

構建者(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物件。