設計模式---結構型模式
結構型設計模式是從程式的結構上解決模組之間的耦合問題。結構型設計模式主要有如下7種模式:
介面卡模式(Adapter)
介面卡提供客戶端(client)需要的介面,介面卡(adapter)的作用就是把客戶端的請求轉化為對適配者(adaptee)的相應介面的呼叫。也就是說:當客戶類呼叫介面卡的方法時,在介面卡類的內部將呼叫適配者類的方法,而這個過程對客戶類是透明的,客戶類並不直接訪問適配者類。因此,介面卡可以使由於介面不相容而不能互動的類可以一起工作。這就是介面卡模式的模式動機。
介面卡模式有4個角色:
- client:
- target:
- adapter:
- adaptee:
類adapter的結構:
程式碼實現過程:
class Target {
public:
virtual 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 {
public:
virtual 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結構:
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)
作用: 為其它物件提供一種代理以控制對這個物件的訪問。