讀GOF設計模式雜記之 Decorator

2021-04-19 07:14:26 字數 2480 閱讀 2115

模式名:decorator

意圖:「動態地」 給乙個「物件」 新增一些額外的職責。

這句話是相對於「靜態地」 給乙個類新增功能說的。當需要給乙個物件增加功能的時候可以有以下兩種選擇:

(1) 一種選擇是在這個物件的類上新增額外的功能**。

缺點: 第一種方式會造成所有的這個類的物件其行為都發生改變。

(2) 第二種選擇是為這個類派生乙個子類用來增加其功能。

缺點: 第二種方式利用了物件導向思想的繼承和多型特性,它可以在不改變其他物件的前提下產生乙個派生型別來增加功能。不過這樣做有一點不足就是會造成類數量的爆 炸。例如有100動物的類,他們有共同的基類「動物」。其中的30種動物成長到一定年齡就會有飛翔的功能,需要給這30種動物增加飛翔的功能。如果利用第 二種方式就會增加30個派生類來表示那些成長到一定年齡的會飛翔的動物。而且如果我想找一種飛翔的動物來送信那麼就需要靜態的(對於靜態語言,如果是動態 語言就沒有這個問題了)選擇好那種動物。

用法:這時我們就可以使用decorator模式來解決我們的問題。

我們還以剛才的那個例子來說明問題。我們從「動物」基類派生乙個flyamnimal,這個類包含乙個指向其他動物的指標,並把基類的介面 (virtual 介面)都對映到所指向的動物身上。另外為所指向的動物增加乙個飛翔功能。這個flyanimal就是乙個 decorator模式的類。

優點:**復用,我們不用在為不同的類定義多個派生類。避免生成多個派生類來重複新增某一特徵。

更為靈活,可以動態指定使用那種飛翔的動物來送信。

缺點:**結構更為複雜,系統更難理解,對於對系統不是很了解的人來說,很難為其增加功能。排錯也更困難。

當所修飾的物件非常大的時候,decorator的代價就會很高。可以考慮使用stategy模式替代。

注意: 介面一致性,修飾類和被修飾類必須要相同的介面,也就是有共同的基類。

可以省略抽象的decorator。僅需要增加乙個職責的時候decorator可以只有乙個而不是乙個decorator樹。

和strategy模式的比較:

decorator可以看作是改變乙個物件的外殼,不改變其已有的核心。只是給物件增加一些功能。decorator物件在元件物件的外部。

strategy模式卻是改變物件的核心,給物件一組可選的核心功能。strategy的物件在元件物件的內部。

和composite模式的比較:

decorator可以看作乙個退化了的,只有乙個組建的composite,同時還可以看作乙個增強了功能的composite。它弱化了composite的聚集物件的功能,卻強化了唯一乙個component的能力。

乙個例子:

/**file name:animal.cpp

*description:乙個簡單的decorator模式的例子

* author: yingjie

* */

#include

using namespace std;

/** 定義animal基類

* */

class animal

virtual ~animal(){}

};/*

*animal 派生的eagle

* */

class eagle:public animal

};/*

*animal 派生的dove

* */

class dove:public animal

};/*

*animal 派生的birdmen

* */

class birdmen:public animal

};/*

*最關鍵的decorator類,它和eagle,dove一樣繼承自animal,它擁有乙個指向animal的指標,並且把基類所有的virtual函式對映到所指向的animal的實現中。然後新增自己修飾函式

* */

class flyanimal:public animal

flyanimal(animal * ptr):p(ptr){}

void setanimal(animal * ptr)

//把基類的virtual函式「全部」對映到所修飾的物件的實現上。

string name()const  

void run()const

void fly()const //新增的修飾函式

~flyanimal()

private:

animal *p;

};/*

*找乙個信使去送信

* */

void sendmail(const flyanimal & sender)

int main()

執行結果:

i am eagle

i am runing!

i am flying!

i am dove

i am runing!

i am flying!

i am birdmen

i am runing!

i am flying!

GOF23 設計模式 之工廠模式

工廠模式本質 例項化物件,工廠方法代替new操作 將實現類和建立物件統一管理和控制,將呼叫者和實現類解耦 工廠模式分為了三種 1,簡單工廠模式 最常用 對於新增產品 要修改 2,工廠方法模式 新增產品不用修改 複雜度高 3,抽象工廠模式 可以增加產品族,進行產品之間的搭配 一般用的少,框架可能會用到...

GOF23 設計模式 之狀態模式

狀態模式 就是事務有很多種狀態時需要應對的一種設計模式 場景有 1,銀行賬號狀態 2,酒店系統 3,多執行緒執行緒狀態 實現 1,狀態介面 package state public inte ce state2,狀態實現類 package state public class empty imple...

設計模式之GOF23模板模式

模板模式template method 場景 具有具體流程,但具體某一步的業務不同 到銀行辦理業務 排隊取號,辦理業務,給員工打分 請客吃飯 等待,點單,吃飯,結賬 模板方法模式介紹 模板方法是程式設計常用的模式,它定義了乙個操作中的演算法骨架,將某些步驟延遲到子類中實現。這樣,新的子類可以在不改變...