天天看點

設計模式--結構型模式比較

        結構型模式為了組合類和對象以獲得更大的結構而産生的一種指導性方法。(A structural design pattern serves as a blueprint for how different classes and objects are combined to form larger structures.)與建立型模式不同的是,後者是為了實作一個統一的目标,即是系統獨立于如何建立、組合和表示它的對象。而結構型模式是為了實作不同的目标而引入的。

        結構類模式是通過繼承來實作類接口和實作的組合,這種模式是極少的。而結構對象模型是通過對象組合來實作多對象方法的組合。結構對象模式是常用的結構型模式。

        GoF将結構模式分為了7種,包括:橋接模式、擴充卡模式、裝飾模式、組合模式、外觀模式、享元模式和代理模式。下面将通過類圖的方式給出每個模式的具體實作(希望大家對類圖有一定的了解)。

       橋接(Bridge)模式:将抽象部分與它的實作分離,使它們可以獨立的變化。(注意橋接模式與其他模式的混合使用,如AbstractFactory)

設計模式--結構型模式比較

        擴充卡(Adapter)模式:将一個類的接口轉換為客戶希望的另一個接口,其可以是原本由于接口不相容不能在一起工作的那些類可以一起工作。值得注意的是擴充卡模式有兩種實作方式:

        參與者:Target、Client、Adaptee、Adapter

        1. 類擴充卡:Adapter同時繼承Target和Adaptee,在Adapter中使用Adaptee的具體方法實作Target中的請求方法。(公有繼承Target、私有繼承Adaptee)

        2. 對象擴充卡:Adapter隻繼承Target,并在類中包含Adaptee的對象,通過對Adaptee對象方法的調用實作Target的方法請求。

設計模式--結構型模式比較
設計模式--結構型模式比較

      裝飾(Decorator)模式:動态的給一個對象添加一些額外的職責。

設計模式--結構型模式比較

        參與者:Component、ConcreteComponent、Decorator、ConcreteDerator

        具體實作:Decorator繼承Component,并包含Component對象指針

int main()
{
   Component *com = new Component();
   Decorator *dec = new Decorator(com);
   dec -> Operation(); //在operation中實作Component的老方法并加入新加入的功能
}
           

        組合(Composite)模式:将對象的組合成樹形結構以表示“部分-整體”的層次結構。需要指出的是組合模式與裝飾模式具有相似的形式化表示,但是二者的側重點和用途卻大不相同。組合模式更側重于對象的表示,而裝飾模式更注重對象功能的擴充;二者都維護着指向父類的指針,但是裝飾模式是用此來運作時指定原有的功能,而組合模式是運作時指定對象的組合。

設計模式--結構型模式比較

       外觀(Facade)模式:為系統中的一組接口提供一個一緻的界面。

       實作:外觀類包含所有子系統的對象指針和一個方法包裝接口,在該接口中實作子系統中的全部的子接口。

設計模式--結構型模式比較

       享元(Flyweight)模式:運用共享技術有效地支援大量細粒度的對象。享元模式的重點是引入了外部特征和内部特征的概念,具體的享元子類通過內建父類的内部特征并加入自身的外部特征生成更多的子類。使用者通過向享元工廠傳入不同的鍵值來索引不同的享元子類。

設計模式--結構型模式比較

         代理(Proxy)模式:為其他對象提供一種代理以控制對這個對象的通路。代理模式相當于使用者不直接通路功能對象接口,而是通過代理對象間接通路。

設計模式--結構型模式比較

注:類圖摘自《C++設計模式》