設計模式大彙總,是時候來複習一波了
如果說在開發過程中有什麼需要反覆學習的,設計模式無疑排在第一位!
這段時間開始複習設計模式,所以,做了一個彙總,希望能夠時不時進行查閱複習一下
僅針對瞭解設計模式的目標使用者,如果還不瞭解,建議花些時間系統的學習一下
觀察者模式
描述:有時被稱作釋出/訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。
用法:
抽象主題(Subject):抽象類或介面,定義統一介面
具體主題(ConcreteSubject):具體類,用來處理訂閱,取消訂閱,以及通知觀察者的功能
抽象觀察者(Observer):抽象類或介面,定義統一通知介面
具體觀察者(ConcreteObserver):具體類,處理具體通知後邏輯等
圖示:
介面卡模式
描述:將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以在一起工作。
用法:
目標介面(Target):抽象類或介面,客戶端需要接的
需要適配的類(Adaptee):需要適配的類或適配者類。
介面卡(Adapter):通過包裝一個需要適配的物件,把Adaptee轉換成Target。
圖示:
簡單工廠模式
描述:將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以在一起工作。
用法:
工廠類(Simple Factory): 只包含了建立具體產品的靜態方法。
抽象產品(Product):定義簡單工廠中要返回的產品。
具體產品(ConcreteProduct):具體產品。
圖示:
工廠方法模式
描述:定義一個用於建立物件的介面,讓子類決定例項化哪一個類。相比於簡單工廠模式,每個子類都專門負責生產一個產品
用法:
抽象工廠(Creator):這個抽象類(或介面)宣告一個建立物件的工廠方法,用來返回一個Product型別的物件。
具體工廠(ConcreteCreator):重定義工廠方法,返回一個具體的Concrete Product例項。
抽象產品(Product):定義工廠方法所建立的物件。
具體產品(ConcreteProduct): 具體產品,繼承自Product抽象類。
圖示:
單例模式
描述:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
用法:
1,懶漢式:它在需要物件的時候,才判斷是否已有物件,如果沒有就立即建立一個物件,然後返回,如果已有物件就不再建立,立即返回。
2,餓漢式:該單例類非常餓,迫切需要吃東西,所以它在類載入的時候就立即建立物件。
其中懶漢式有執行緒安全的問題,需要注意!
代理模式
描述:如果直接訪問物件比較困難,或直接訪問會給使用者或系統帶來一系列問題。這樣對於客戶端(呼叫者)來說,就不需要直接與真實物件進行互動,解除了呼叫者與真實物件的耦合。
用法:
抽象實體(Subject):定義了真實實體(RealSubject)和代理(Proxy)的公共介面,這樣就在任何時候使用真實實體(RealSubject)的地方使用代理(Proxy)。
代理(Proxy):儲存一個引用使得代理可以直接訪問真實實體,並提供一個與Subject的介面相同的介面,這樣代理就可以代替真實實體。
真實實體(RealSubject):定義Proxy所代表的真實實體。
圖示:
裝飾模式
描述:動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更靈活。
用法:
抽象構建(Component):定義一個抽象介面,用以給這些物件動態地新增職責。
具體構建(ConcreteComponent):定義一個具體的物件,也可以給這個物件新增一些職責。
裝飾類(Decorator): 裝飾抽象類,繼承了Component,從外類來擴充套件Component類的功能。
具體裝飾者(ConcretorDecorator):負責給構建物件新增職責。
圖示:
建造者模式
描述:將一個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示,這樣的設計模式被稱為建造者模式。
用法:
建造者(Builder):為建立一個產品物件的各個部件指定抽象介面。
具體建造者(ConcreteBuilder):實現Builder的介面以構造和裝配該產品的各個部件,定義並明確它所建立的表示,並 提供一個檢索產品的介面。
指揮者(Director):指揮並構造一個使用Builder介面的物件。
產品(Product):表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的介面。
圖示:
未完待續
本文所有類圖引用博主:http://www.cnblogs.com/wangjq,在此表示感謝!