女人常說男人喜新厭舊。僅僅見新人笑,那聞舊人哭,但裝飾模式(decorator)卻是一種結交新朋友不忘老朋友的設計模式,很適合去古代當老公(現代是不行的。由於僅僅能娶乙個老婆了)。裝飾模式的本質是每個裝飾物件都被保留乙個被其裝飾的物件,裝飾物件在展示新功能時會同一時候去呼叫被其裝飾的物件的同功能函式,通過如此層層包括呼叫(即裝飾)。形成乙個類似鍊錶的結構。接下來的介紹中,我們還會看到很多其它的類似鍊錶結構的設計模式,比方職責鏈模式、狀態模式。
仍以《大話設計模式》一書中裝飾模式的小菜穿衣的樣例為例。來看看裝飾模式是怎樣做到家裡紅旗不倒,外面彩旗飄飄的。小菜要去會妹子。臨行前為了給妹子留個好印象。精選牛仔褲一條。然後搭上簡約風t恤,裝扮一新後出門。為了可以讓小菜搭配不論什麼衣服。使用裝飾模式描寫敘述這一過程。
1、穿衣基類。僅僅有乙個函式show(),顯示穿的衣服
class cdress
virtual void show()
};
2、裝飾類基類
class cfinery : public cdress
virtual ~cfinery() {}
virtual void show() }
void decorate(cdress* pocdress)
private:
cdress* m_podress;
};
3、t恤和牛仔褲的詳細裝飾類
class ctshirt : public cfinery
void show() };
class cjeans : public cfinery
void show()
};
這裡需注意,裝飾類物件的show()函式在顯示出本物件的裝扮的同一時候,須要去呼叫裝飾基類的show()函式,以顯示其被裝飾物件的舊有裝扮。即不能忘了老朋友。
4、裝飾過程
int main(int argc, char* ar**)
通過裝飾過程能夠看出,ocjeans 物件裝飾了 octshirt 物件。所以 ocjeans 呼叫 show() 函式時會呼叫 octshirt 的 show() 函式,octshirt 又裝飾了 ocdress 物件。這時 octshirt 又會呼叫 ocdress 的 show() 函式。有點類似遞迴,也有點類似鍊錶的味道,當然我們知道遞迴須要有乙個終結者的。不然就沒完沒了了,所以最後被裝飾的物件 ocdress 是不在有不論什麼裝飾物件的。
5、裝飾模式的應用
裝飾模式適合在原有功能上新增了新功能,可是新功能被呼叫前/後仍須要呼叫原有功能的情況,特別適合功能一層一層的擴充套件,同一時候保持舊有功能的正常呼叫的場景。
比方我們設計乙個編輯框的控制項類,最初僅僅有編輯文字的功能,我們新增乙個裝飾類後,我們能編輯出彩色的文字,這時我們僅僅須要設定控制項的背景顏色,然後去呼叫舊的物件編輯文字功能就可以。過一段時間老大提新要求了,要求這個編輯框控制項要搞和諧社會,要遮蔽敏感詞,這時我們再新增乙個裝飾類。新增建設和諧社會功能後,再去呼叫編輯彩色文字的裝飾類。當然,我們還能靈活變動,搞和諧社會的裝飾類為了不花哨,也能夠直接裝飾原來的編輯框控制項類。拋棄中間搞彩色文字的過程。
大話設計模式 裝飾模式
動態地給乙個物件新增一些額外的職責。優點 把類中的裝飾功能從類中搬移出去,這樣可以簡化原有的類。有效地把類的核心功能和裝飾功能區分開了。解決的問題 已經開發完畢的物件,後期由於業務需要,對舊的物件需要擴充套件特別多的功能,這時候使用給物件動態地新增新的狀態或者行為 即裝飾模式 方法,而不是使用子類靜...
大話設計模式 裝飾模式
前言穿衣打扮是現在的時尚潮流,我們時常刷 來不斷滿足自己的打扮需求,買個帽子 換條褲子 整雙時尚鞋。需求是沒有極限的,無止境的購物,只要存在這個平台那麼這些裝飾性的購物是不可避免的。這在我們軟體開發中可以看做是為我們例項化的物件新增一些額外的功能,要是我們對於每個都定義個子類來繼承的話,那就是指數增...
大話設計模式 裝飾模式
裝飾模式 動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。裝飾模式的uml類圖 component是定義乙個物件介面,可以給這些物件動態的新增職責。concretecomponent是定義了乙個具體的物件,也可以給這個物件新增一些職責。decorator,裝飾抽象類,...