1. 程式人生 > >設計模式---結構型模式

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

結構型設計模式是從程式的結構上解決模組之間的耦合問題。結構型設計模式主要有如下7種模式:

介面卡模式(Adapter)

介面卡提供客戶端(client)需要的介面,介面卡(adapter)的作用就是把客戶端的請求轉化為對適配者(adaptee)的相應介面的呼叫。也就是說:當客戶類呼叫介面卡的方法時,在介面卡類的內部將呼叫適配者類的方法,而這個過程對客戶類是透明的,客戶類並不直接訪問適配者類。因此,介面卡可以使由於介面不相容而不能互動的類可以一起工作。這就是介面卡模式的模式動機。

介面卡模式有4個角色:
- client:
- target:
- adapter:
- adaptee:

類adapter的結構:
class實現

程式碼實現過程:

class Target {
publicvirtual void Request();
}
class Adaptee {
public:
   void SpecificRequest();
}
class Adapter : public class Target, private class Adaptee {
public:
    void Request() {
        SpecificRequest();
    }
}

物件adapter的結構:
物件結構

class Adaptee {
public
: void SpecificRequest(); } class Target { publicvirtual void Request(); public: Adaptee* adaptee; } class Adapter : public class Target { public: Adapter(){ adaptee = new Adapter(); } ~Adapter() { delete adaptee; } void Request() { adaptee->SpecificRequest(); } }

橋接模式(Bridge)

作用:將抽象(Abstraction)與實現(Implementation)分離,使得二者可以獨立地變化。
bridge結構:
bridge

  • Abstraction

    定義抽象類的介面。維護一個指向 Implementor 型別物件的指標。

  • RefinedAbstraction

    擴充由 Abstraction 定義的介面。

  • Implementor

    定義實現類的介面,該介面不一定要與 Abstraction 介面完全一致,甚至可以完全不同。
    Implementor 介面僅提供基本操作,Abstraction 則定義了基於這些基本操作的較高層次的操作。

  • ConcreteImplementor

    實現 Implementor 介面並定義它的具體實現。

在以下情況下可以使用 Bridge 模式:

  • 你不希望在抽象和它的實現部分之間有一個固定的繫結關係。比如需要在程式執行時刻實現部分應可以被選擇或者切換。
  • 類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。
  • 對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的程式碼不必重新編譯.
  • 你想對客戶完全隱藏抽象的實現部分。
  • 類的層次需要將一個物件分解成兩個部分。
  • 你想在多個物件間共享實現,但同時要求客戶並不知道這一點。

程式碼實現:

class Abstraction {
public:
   Abstraction(Implementor* implementor) {imp = implementor; }
   virtual void Operation() {
      imp->Operation();
   }
private:
   Implementor* imp;
}
class RefinedAbstraction : public class Abstraction {
public:
    virtual void OtherOperation();
}

class Implementor {
public:
   virtual void Operation();
}

class ConcreteImplementorA : public Implementor {
public:
    void Operation();
}

class client {
public:
   void Test () {
      Implementor* imp = new ConcreateImplementorA();
      Abstraction* abstracat = new Abstraction(imp);
      abstract->Operation();
  }
}      

組合模式(Composite)

組合模式,將物件組合成樹形結構以表示“部分-整體”的層次結構,Composite 使得使用者對於單個物件和組合物件的使用具有一致性。
composite 模式結構圖:
這裡寫圖片描述

涉及角色:

  • Component 是組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告一個介面用於訪問和管理Component子部件。
  • Leaf 在組合中表示葉子結點物件,葉子結點沒有子結點。
  • Composite 定義有枝節點行為,用來儲存子部件,在Component介面中實現與子部件有關操作,如增加(add)和刪除(remove)等。

適用場景:

  • 你想表示物件的部分-整體層次結構
  • 你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。

裝飾模式(Decorator)

作用: 動態地給一個物件新增一些額外的職責。就增加功能來說,裝飾模式比生成子類更為靈活。
構造圖:
這裡寫圖片描述

適用的場景:

  • 需要擴充套件一個類的功能,或給一個類增加附加責任。
  • 需要動態的給一個物件增加功能,這些功能可以再動態地撤銷。
  • 需要增加一些基本功能的排列組合而產生的非常大量的功能,從而使繼承變得 不現實。

外觀模式(Facade)

作用: 為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
這裡寫圖片描述

享元模式(Flyweight)

作用:運用共享技術有效地支援大量細粒度的物件。

內部狀態intrinsic和外部狀態extrinsic:

1)Flyweight模式中,最重要的是將物件分解成intrinsic和extrinsic兩部分。

2)內部狀態:在享元物件內部並且不會隨環境改變而改變的共享部分,可以稱為是享元物件的內部狀態

3)外部狀態:而隨環境改變而改變的,取決於應用環境,或是實時資料,這些不可以共享的東西就是外部狀態了。

4)內部狀態和外部狀態之間的區別:
  在Flyweight模式應用中,通常修改的是外部狀態屬性,而內部狀態屬性一般都是用於參考或計算時引用。
Flyweight執行時所需的狀態必定是內部的或外部的。內部狀態儲存於ConcreteFlyweight物件之中;而外部狀態則由Client物件儲存或計算。當用戶呼叫Flyweight物件的操作時,將該狀態傳遞給它。

這裡寫圖片描述

代理模式(Proxy)

作用: 為其它物件提供一種代理以控制對這個物件的訪問。

這裡寫圖片描述