設計模式之結構型模式
一、結構型模式概述
二、結構型模式內容
1、適配器模式
(1)功能:
將一個類的接口轉換成客戶希望的另外一個接口,使得原本接口不兼容而不能一起工作的那些類可以一起工作。
安裝客戶需求的接口復用現有一個接口使得現有的接口可以與不兼容的接口一起工作
(2)適用性:
1)想要復用現有的一個類,但是它的接口又不符合要求時
2)想要創建一個可以復用的類,該類可以與其他不相關的類或者不可預見的類協同工作(即可以與不兼容接口進行協同)
(3)結構
(4)參與者
Target:目標需求,定義Client使用的與特定領域相關的接口
Client:客戶端要求與Target接口的對象協同
Adaptee:定義一個已經存在的類,即要復用的類。也就是需要適配器的接口
Adapter:適配器實現Target接口的包裝Adaptee接口的接口
(5)優缺點
(6)相關模式
1)橋接模式:
與橋接模式類似,但是出發點不同。橋接模式的目的是將接口部分和實現部分分離,從而對它們可以較為容易也相對獨立的加以改變。
而適配器模式:意味著改變一個已有對象的接口
2)裝飾模式:
裝飾模式增強了其他對象的功能而同時又不改變它的接口。裝飾模式對應用程序的透明性比適配器要好。且支持遞歸組合
純粹使用適配器不可能實現這一點
3)代理模式:
在不改變它的接口條件下,為另一個對象定義了代理。
2、橋接模式
(1)功能
將抽象部分與它的實現部分分離,使它們都可以獨立地變化
實現系統可能有多角度分類,每一種分類都有可能變化,那麽就把這種多角度分離出來的讓它們獨立變化,減少它們之間的耦合度。
(2)適用條件
1)不希望抽象部分與實現部分過度耦合
2)實現部分的修改對客戶不產生影響,即客戶的代碼不用重新編譯
3)向客戶完全隱藏實現部分
4)為避免使用繼承造成增加大量的類,且不能滿足開放-封閉原則的情況下使用橋接模式
(3)結構
(4)參與者
Implementor:具體實現的接口,定義實現類的接口
ConcreteImplementor:實現Implementor的負責具體實現的類
Abstractor:抽象部分的接口。定義抽象類的接口
RefinedAbstractor:擴充由Abstractor定義的接口
(5)優缺點
1)優點:a.提高可擴展性;b.實現細節對客戶透明
2)缺點:
(6)相關模式
1)抽象工廠模式:
橋接模式可以用抽象工廠模式創建和配置一個特定的橋接模式
2)適配器模式:
用來幫助無關類的協同工作,一般是在系統完成設計後才會使用
而橋接模式使在系統設計開始的時候就開始使用,它的抽象部分和實現部分可以獨立的進行改變。
3、組合模式
(1)功能
將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性
(2)適用條件
1)想要體現部分與整體的層次結構的時候
2)希望用戶忽略組合對象和單個對象的不同,統一的使用組合結構中的所有對象時候
(3)結構
(4)參與者
Componet:表示組合中的對象的接口,提供訪問和管理子部件的接口。適當的情況下,可以對共有的接口提供默認實現
Leaf:表示組合中沒有子節點的葉子節點,實現Component接口。但是不具體實現訪問和管理字節的接口,因為它沒有子節點
Composite:表示組合中具有子節點且實現Component接口的對象,實現了Component接口中定義的訪問和操作子部件的接口。
(5)優缺點
1)優點:
a.簡化客戶代碼
b.更容易增加新類型的組件
2)缺點:很難顯示組合中的組件
(6)相關模式
1)責任鏈模式: 通常部分-父部件連接用於責任鏈模式
2)裝飾模式:裝飾模式和組合模式一起搭配使用。他們具有一個公共的父類,裝飾類必須支持具有Add,Remove,getChild操作的Component
3)享元模式:享元模式讓你共享組件,但是不再能引用他們的父部件
4)叠代器模式:用來遍歷組合模式
5)訪問者模式:將本來應該分布在Composite和Leaf中的操作和行為局部化。
4、裝飾模式
(1)功能
動態的給一個對象增加額外的職責,就增加功能來講,裝飾模式比生成子類更為靈活
(2)適用條件
1)在不影響其他對象的情況下,以動態,透明的方式給單個對象添加職責
2)處理那些可以撤銷的職責
3)需要區分核心職責和裝飾功能的時候
(3)結構
當只有一個ConcreteComponent類而沒有Component的時候,那麽Decorator類可以是ConcreteComponent的一個子類。
同理,如果只有一個ConcreteDecorator那麽就沒有必要創建一個單獨的Decorator類,而可以吧Decorator和ConcreteDecorator的責任合並層一個類。
(4)參與者
Conponent:定義一個對象的接口,就是需要裝飾的類,即裝飾的目標類
ConcreteComponent:定義一個具體的對象,也可以被裝飾。在只有一個ConcreteComponent的情況下,不需要實現Component接口,直接將ConcreteComponent作為Decorator的父類
Decorator:裝飾抽象類
ConcretorDecorator:具體的裝飾類,實現Decorator接口
(5)優缺點
1)優點:a.將類中的裝飾功能從類中搬移去除,簡化原有的類
b.有效的將核心職責和裝飾功能區分開了,而且可以去除相關重復的裝飾邏輯
(6)相關模式
1)適配器模式: 裝飾模式僅改變對象的職責而不改變它的接口,而適配器模式將給對象一個全新的接口。
2)組合模式:裝飾模式的目的不是在聚集,裝飾模式可以視為一個退化的,僅有一個組件的組合。
3)策略模式:裝飾模式改變的是對象的外表,而策略模式改變的是對象的內核。改變對象的兩種途徑:裝飾模式,策略模式
5、外觀模式
(1)功能
為子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用
(2)適用條件
1)需要為一個復雜的子系統提供一個簡單接口時
2)客戶端與抽象的具體實現存在很大的依賴的的時候,引入Facade實現客戶端與子系統解耦、分離,提供子系統的獨立性和可移植性。
3)當需要構建一個層次結構的子系統,子系統之間彼此分離降低依賴,使用Facade定義子系統中每層的入口點。
(3)結構
(4)參與者
Facade:外觀類,知道哪些子系統類負責處理請求。將客戶的請求代理給適當的子系對象。
SubSystem:表示子系統中的一組接口。實現子系統中的功能,處理有Facade對象指派的任務,沒有任何Facademic對象的引用
(5)優缺點
1)對客戶屏蔽了子系統,減少了客戶需要處理對象的數目並使得子系統使用起來更加方便
2)實現客戶與子系統的松耦合關系,有助於建立層次結構系統,也有助於對對象之間的依賴關系分成。可以消除復雜的循環依賴問題
(6)相關模式
1)抽象工廠:抽象工廠可以和外觀模式一起搭配使用以提供一個接口,這個接口可用來以一種子系統獨立的方式創建子系統。抽象工廠也可以代替外觀模式隱藏哪些與平臺相關的類
2)中介者模式:
外觀模式:是抽象了一組已有類的功能
中介者模式:是抽象了同事之間的任意通信
3)單例模式:Facade對象通常屬於單例模式
6、享元模式
(1)功能
運用共享技術有效的支持大量細粒度的對象
(2)適用條件
1)應用程序內使用大量的對象,而這些大量的對象造成了很大的存儲開銷
2)對象存在外部狀態,要使用相對較少的共享對象取代大量的對象
(3)結構
(4)參與者
Flyweight:描述一個接口,通過這個Flyweight接口可以接受和並作用於外部狀態
ConcreteFlyweight:繼承或者實現Flyweight接口的 。ConcreteFlyweight對象必須是可共享的,它存儲的狀態必須是內部的,即內部狀態應該獨立於ConcreteFlyweight對象的場景
內部狀態:在享元對象內部,並且不隨外部環境改變而改變的共享部分就是享元對象的內部狀態。內部狀態也就是共享的大量細粒度對象內彼此都相同的部分。
外部狀態:隨環境改變而改變,不可以共享的狀態就是外部狀態。外部狀態存在於客戶端。外部狀態就是共享的大量細粒度對象內部彼此差異不相同的部分。將這些(外部狀態)從共享對象內部移動到外部,然後在方法調用的時候在傳進來,就可以實現通過共享大幅度的減少單個實例的數目。
UnsharedConcreteFlyweight:並非所有的Flyweight子類都需要共享,Flyweight接口是共享成為可能,但是他不是強制的。
FlyweightFacotry:負責創建和管理Flyweight的對象。確保合理的共享Flyweight。當用戶請求一個Flyweight的時候,FlyweightFacotry對象提供一個已經創建或者新創建的Flyweight對象(如果不存在的話)
Client:維持對一個Flyweight對象的引用,並計算或者存儲一至多個Flyweight的外部狀態
(5)優缺點
1)優點:大大減少了實例數目
2)缺點:使系統變得復雜。為了對象可以共享,需要將一些狀態外部化,使得程序的邏輯復雜化
(6)相關模式
1)組合模式:享元模式通常和組合模式結合起來使用,用共享葉節點的有向無還圖實現一個邏輯上的層次結構
2)狀態模式:享元模式使狀態對象的最佳實現方式
3)策略模式::享元模式使策略對象的最佳實現方式
7、代理模式
(1)功能
(2)適用條件
(3)結構
(4)參與者
(5)優缺點
(6)相關模式
三、結構型模式總結
設計模式之結構型模式