1. 程式人生 > >設計模式C++實現(11)——裝飾模式

設計模式C++實現(11)——裝飾模式

 

        軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》和《設計模式:可複用面向物件軟體的基礎》兩本書。本文介紹裝飾模式的實現。

       裝飾模式:動態地給一個物件新增一些額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活。有時我們希望給某個物件而不是整個類新增一些功能。比如有一個手機,允許你為手機新增特性,比如增加掛件、螢幕貼膜等。一種靈活的設計方式是,將手機嵌入到另一物件中,由這個物件完成特性的新增,我們稱這個嵌入的物件為裝飾。這個裝飾與它所裝飾的元件介面一致,因此它對使用該元件的客戶透明。下面給出裝飾模式的UML圖。

        在這種設計中,手機的裝飾功能被獨立出來,可以單獨發展,進而簡化了具體手機類的設計。下面給出Phone類的實現:

//公共抽象類
class Phone
{
public:
	Phone() {}
	virtual ~Phone() {}
	virtual void ShowDecorate() {}
};

        具體的手機類的定義:

//具體的手機類
class iPhone : public Phone
{
private:
	string m_name; //手機名稱
public:
	iPhone(string name): m_name(name){}
	~iPhone() {}
	void ShowDecorate() { cout<<m_name<<"的裝飾"<<endl;}
};
//具體的手機類
class NokiaPhone : public Phone
{
private:
	string m_name;
public:
	NokiaPhone(string name): m_name(name){}
	~NokiaPhone() {}
	void ShowDecorate() { cout<<m_name<<"的裝飾"<<endl;}
};

        裝飾類的實現:

//裝飾類
class DecoratorPhone : public Phone
{
private:
	Phone *m_phone;  //要裝飾的手機
public:
	DecoratorPhone(Phone *phone): m_phone(phone) {}
	virtual void ShowDecorate() { m_phone->ShowDecorate(); }
};
//具體的裝飾類
class DecoratorPhoneA : public DecoratorPhone
{
public:
	DecoratorPhoneA(Phone *phone) : DecoratorPhone(phone) {}
	void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
private:
	void AddDecorate() { cout<<"增加掛件"<<endl; } //增加的裝飾
};
//具體的裝飾類
class DecoratorPhoneB : public DecoratorPhone
{
public:
	DecoratorPhoneB(Phone *phone) : DecoratorPhone(phone) {}
	void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
private:
	void AddDecorate() { cout<<"螢幕貼膜"<<endl; } //增加的裝飾
};

         客戶使用方式:

int main()
{
	Phone *iphone = new NokiaPhone("6300");
	Phone *dpa = new DecoratorPhoneA(iphone); //裝飾,增加掛件
	Phone *dpb = new DecoratorPhoneB(dpa);    //裝飾,螢幕貼膜
	dpb->ShowDecorate();
	delete dpa;
	delete dpb;
	delete iphone;
	return 0;
}

       裝飾模式提供了更加靈活的向物件新增職責的方式。可以用新增和分離的方法,用裝飾在執行時刻增加和刪除職責。裝飾模式提供了一種“即用即付”的方
法來新增職責。它並不試圖在一個複雜的可定製的類中支援所有可預見的特徵,相反,你可以定義一個簡單的類,並且用裝飾類給它逐漸地新增功能。可以從簡單的部件組合出複雜的功能。[DP]

       在本文的例子中,我們定義了兩個具體的手機類,iPhone類和NokiaPhone類,通過單獨的裝飾類為它們新增特性,從而組合出複雜的功能。
       本人享有部落格文章的版權,轉載請標明出處 http://blog.csdn.net/wuzhekai1985

相關推薦

設計模式C++實現11——裝飾模式

          軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,

設計模式C++實現2——策略模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一

設計模式C++實現3——介面卡模式

        軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深

設計模式C++實現12——備忘錄模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》

設計模式C++實現1——工廠模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》

設計模式C++實現20——直譯器模式

1. 直譯器模式(Interpreter Pattern)的定義 (1)定義   給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。   ①文法:即語法規則。在直譯器模式中每一個語法都將對應一個直譯器物件,用來處理相應的

設計模式C++實現5——原型模式、模板方法模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一

設計模式C++實現9——享元模式

        軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》

設計模式 c++版9——原型模式

定義:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。 示例一:個性化電子賬單 1. 需求說明: 銀行傳送電子賬單的郵件一般是有要求的:①個性化服務:發過去的郵件上總有一些個人資訊,比如姓氏等。②遞送成功率:若大批量地傳送郵件會被收房郵件伺服器誤認為是

設計模式 c++版13——策略模式

定義: 定義一組演算法,將每個演算法都封裝起來,並且使他們之間可以互換 示例一:策略模式(通用版) 1. 類圖18-3 2. 類圖說明 策略模式使用的就是面向物件的繼承和多型機制 Context 封裝角色。也叫上下文角色,起承上啟下的封裝作用,遮蔽高層模組對策

設計模式 c++版18——門面模式

定義: 要求一個子系統的外部與其內部的通訊必須通過一個統一的物件進行。門面模式提供一個高層次的介面,使得子系統更易於使用(門面模式也叫做外觀模式)。 示例一:門面模式(通用版) 1. 類圖23-4 2. 類圖說明 Subsystem Classes 是子系統所有

六種常用的設計模式java實現模板模式

模板模式,估計大家應該都接觸過,比如說,在完成某個業務邏輯前,需要處理一點事,在完成後也要處理一點事,這樣就可以把不一樣的地方給抽象出來,然後公共的地方都是一樣的,這樣的場景就會用到模板模式。 一、基本概念 模板方法模式是類的行為模式。準備一個抽象類,將部分

設計模式 c++版19—— 狀態模式

定義: 當一個物件內在狀態改變時允許其改變行為,這個物件看起來像改變了其類。(狀態的變更引起了行為的變更,從外部看起來好像這個物件對應的類發生了改變一樣) 示例一:狀態模式(通用版) 1. 類圖 26-5 2. 類圖說明 State 抽象狀態角色 介面或抽象類,

23種設計模式裝飾模式python_c++實現

23種設計模式之(九)組合模式(Composite) 本文主要介紹23種設計模式之組合模式,附詳細python/c++示例程式碼。 - 概念 - 應用場景 - 注意事項 - 程式碼示例 - 總結 - 程式碼連結 組合模式(Composit

設計模式C++實現:包裝器外觀模式Wrapper Facade

包裝器外觀模式(Wrapper Facade)把現有的非面向物件的API所提供的函式和資料,封裝在更加簡潔的、健壯的、可移植的、可維護的和內聚的面向物件的類介面中。 一般通過兩種方式實現跨平臺: 1

《Head First 設計模式》例子的C++實現2 觀察者模式

最近在學習設計模式,用的是 《Head First 設計模式》這本書。感覺這本書寫的還是很不錯的,深入淺出的介紹了各種常用的設計模式。唯一有點不方便的地方是這本書的例子全都是用的 Java 來實現的。而我主要是用 C++。所以就動手將書上的程式碼用 C++ 來實

設計模式裝飾模式

裝飾模式(Decotator):動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活 這是在網上找的關於裝飾模式的類圖, http://img0.imgtn.bdimg.com/it/u=3834882730,1020120806&fm=214&

JAVA設計模式詳解----------裝飾模式

今天LZ帶給大家的是裝飾者模式,提起這個設計模式,LZ心裡一陣激動,這是LZ學習JAVA以來接觸的第一個設計模式,也許也是各位接觸的第一個設計模式。記得當初老師在講IO的時候就提到過它:“是你還有你,一切拜託你。”沒錯,這就是裝飾者模式最簡潔的定義了。下面LZ引出標準的定義(

設計模式裝飾模式

裝飾者模式:若要擴充套件功能,裝飾者提供了比整合更有彈性的替代方案,動態地將責任附加到物件上。 先簡單描述下裝飾者模式發揮作用的地方,當我們設計好了一個類,我們需要給這個類新增一些輔助的功能,並且不希望改變這個類的程式碼,這時候就是裝飾者模式大展雄威的時候了。這裡還體現了一

設計模式裝飾模式

老樣子,先來看一個需求: 現在要求寫一個可以給人搭配不同的服飾的系統,比如類似QQ、網路遊戲或論壇都有的Avatar系統。怎麼開發? 第一個版本可能是這樣的—— 第一版 結構圖:   Person類: class Person{ private st