最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)設(shè)計(jì)模式之裝飾者模式詳解

 更新時(shí)間:2021年09月29日 10:15:46   作者:今天也要努力搬磚  
這篇文章主要介紹了C++設(shè)計(jì)模式之裝飾模式,裝飾模式能夠?qū)崿F(xiàn)動(dòng)態(tài)的為對(duì)象添加功能,是從一個(gè)對(duì)象外部來給對(duì)象添加功能,需要的朋友可以參考下

設(shè)計(jì)模式和設(shè)計(jì)原則

裝飾者模式動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾者模式提供了比繼承更有彈性的替代方案。

裝飾者模式遵循的設(shè)計(jì)原則

類應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。

裝飾者模式中的類

裝飾者模式中的類如下圖,C++設(shè)計(jì)模式之裝飾模式

其中Component抽象組件類,即被裝飾的類,每個(gè)組件都可以單獨(dú)使用,或者被裝飾者包起來使用。該類中聲明了一些接口,這些接口將在具體組件,以及具體裝飾者中實(shí)現(xiàn)。

ConcreteComponent具體組件類,繼承自組件類,是我們要?jiǎng)討B(tài)地加上新行為(即要裝飾)的對(duì)象。

Decorator抽象裝飾者類是具體裝飾者的基類,裝飾者類中包含一個(gè)組件類型的指針,是為了記錄被裝飾的對(duì)象。當(dāng)需要獲得裝飾之后的行為時(shí)可以通過該指針獲得被裝飾者的行為加上裝飾者自身的行為,這個(gè)在下面案例中會(huì)看到。

ConcreteDecorator具體裝飾者類,裝飾者類要實(shí)現(xiàn)Decorator中定義的方法,另外可以加一些新的方法。

如上圖所示裝飾者和被裝飾者必須是一樣地類型,也就是有共同地超類,這是相當(dāng)關(guān)鍵的地方。這是因?yàn)檠b飾者必須能取代被裝飾者。

案列描述

咖啡館提供各種各樣的咖啡,每種咖啡可以加不同調(diào)料(摩卡、奶泡,雙糖,半糖等)。以飲料為抽象組件,各種各樣的咖啡為具體組件,咖啡中的不同調(diào)料為裝飾者。每種咖啡以及調(diào)料有各自的描述和價(jià)格,使用裝飾者模式,加了不同調(diào)料的咖啡也可以輕松給出描述和價(jià)格。

下面例子中生產(chǎn)三種咖啡:不加調(diào)料的Espresso、加雙倍摩卡一份奶泡的DarkRoast和加雙倍奶泡一份摩卡的HouseBlend.。

代碼實(shí)現(xiàn)

聲明:類的聲明和實(shí)現(xiàn)在同一個(gè)文件里是個(gè)壞習(xí)慣,壞習(xí)慣,壞習(xí)慣,但因?yàn)槲覒?,還是寫一起了,大家不要效仿,要引以為戒,要引以為戒,要引以為戒。

首先定義抽象組件類Beverage和抽象裝飾者類CondimentDecorator,代碼如下。這里關(guān)鍵的地方是抽象裝飾者繼承自抽象組件,且包含一個(gè)抽象組件的引用。

//抽象組件類-飲料
class Beverage
{
public:
	Beverage() :m_description("Unknown Beverage")
	{
	}
	virtual std::string getDescription(){ return m_description; }
	virtual double cost() = 0;
protected:
	std::string m_description;
};
//抽象裝飾者類-調(diào)料,繼承自飲料類
class CondimentDecorator :public Beverage
{
public:
	CondimentDecorator(Beverage* berverge) 
		:m_beverage(berverge)
	{
	}
	virtual std::string getDescription() = 0;//定義成純虛函數(shù),是為了強(qiáng)制子類實(shí)例化時(shí)必須實(shí)現(xiàn)它。
protected:
	Beverage* m_beverage;
};

然后定義具體組件,即三種具體的咖啡DarkRoast、Espresso和HouseBlend。

//三個(gè)具體組件
class DarkRoast :public Beverage
{
public:
	DarkRoast()
	{
		m_description = "DarkRoast";
	}
	double cost()
	{
		return 2.99;
	}
};
class Espresso :public Beverage
{
public:
	Espresso()
	{
		m_description = "Espresso";
	}
	double cost()
	{
		return 1.99;
	}
};
class HouseBlend :public Beverage
{
public:
	HouseBlend()
	{
		m_description = "HouseBlend";
	}
	double cost()
	{
		return 0.89;
	}
};

再定義兩個(gè)具體裝飾者類,即兩種調(diào)料Mocha和Milk。

//兩個(gè)具體裝飾者
class Mocha :public CondimentDecorator
{
public:
	Mocha(Beverage* beverage) :CondimentDecorator(beverage)
	{
	}
	std::string getDescription()
	{
		return  m_beverage->getDescription() + " Mocha";
	}
	double cost()
	{
		return 0.2 + m_beverage->cost();
	}
};
class Milk :public CondimentDecorator
{
public:
	Milk(Beverage* beverage) :CondimentDecorator(beverage)
	{
	}
	std::string getDescription()
	{
		return  m_beverage->getDescription() + " Milk";
	}
	double cost()
	{
		return 0.5 + m_beverage->cost();
	}
};

最后在main函數(shù)中寫測(cè)試代碼,生產(chǎn)三種咖啡:不加調(diào)料的Espresso、加雙倍摩卡一份奶泡的DarkRoast和加雙倍奶泡一份摩卡的HouseBlend.

//測(cè)試代碼
int main()
{
	//不加調(diào)料的Espresso
	Beverage* beverage = new Espresso();
	std::cout << beverage->getDescription() << " ¥" << beverage->cost() << std::endl;
	//加雙倍摩卡和奶泡的DarkRoast
	Beverage* beverage2 = new DarkRoast();
	beverage2 = new Mocha(beverage2);
	beverage2 = new Mocha(beverage2);
	beverage2 = new Milk(beverage2);
	std::cout << beverage2->getDescription() << " ¥" << beverage2->cost() << std::endl;
	//加雙倍奶泡的和一份摩卡的HouseBlend
	Beverage* beverage3 = new HouseBlend();
	beverage3 = new Mocha(beverage3);
	beverage3 = new Milk(beverage3);
	beverage3 = new Milk(beverage3);
	std::cout << beverage3->getDescription() << " ¥" << beverage3->cost() << std::endl;
	system("pause");
	delete beverage;
	delete beverage2;
	delete beverage3;
}

運(yùn)行結(jié)果

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語言switch語句詳解

    C語言switch語句詳解

    這篇文章主要為大家介紹了C語言switch語句,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C++中md5 算法實(shí)現(xiàn)代碼

    C++中md5 算法實(shí)現(xiàn)代碼

    在網(wǎng)上找了份c++ MD5的代碼,就簡(jiǎn)單保存一下,需要的朋友可以參考下
    2017-07-07
  • 談?wù)剉ector的特殊性之為什么它不是STL容器

    談?wù)剉ector的特殊性之為什么它不是STL容器

    這篇文章主要給大家介紹了關(guān)于vector的特殊性之為什么它不是STL容器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 淺析C++淺拷貝與深拷貝的聯(lián)系和區(qū)別

    淺析C++淺拷貝與深拷貝的聯(lián)系和區(qū)別

    在c++中,深拷貝和淺拷貝也算是一個(gè)難點(diǎn),特別是對(duì)于初學(xué)者來說,往往在不知道兩者區(qū)別的情況下而錯(cuò)誤的使用了淺拷貝,從而導(dǎo)致了野指針之類的問題,但是又因?yàn)槿鄙倮斫馑院茈y定位到問題所在
    2022-09-09
  • Qt使用事件與定時(shí)器實(shí)現(xiàn)字幕滾動(dòng)效果

    Qt使用事件與定時(shí)器實(shí)現(xiàn)字幕滾動(dòng)效果

    我們經(jīng)常能夠在外面看到那種滾動(dòng)字幕,那么本文就拿Qt來做一個(gè)吧,本文將使用事件與定時(shí)器實(shí)現(xiàn)字幕滾動(dòng)的效果,感興趣的小伙伴可以了解一下
    2023-06-06
  • C語言編程C++自定義個(gè)性化類型

    C語言編程C++自定義個(gè)性化類型

    這篇文章主要介紹了C語言編程中如何來自定義C++個(gè)性化類型,文中附含詳細(xì)的示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • C++實(shí)現(xiàn)歸并排序

    C++實(shí)現(xiàn)歸并排序

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)歸并排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言數(shù)據(jù)類型枚舉enum全面詳解示例教程

    C語言數(shù)據(jù)類型枚舉enum全面詳解示例教程

    生活中有很多地方會(huì)用到枚舉,比如一周有7天,可以一一枚舉;性別有男、女...等等都可以可以一一枚舉,今天來和筆者一起學(xué)習(xí)一下c語言枚舉吧
    2021-10-10
  • C/C++ Qt 數(shù)據(jù)庫與Chart歷史數(shù)據(jù)展示

    C/C++ Qt 數(shù)據(jù)庫與Chart歷史數(shù)據(jù)展示

    這篇文章主要介紹了Qt利用Qchart組件展示數(shù)據(jù)庫中的歷史數(shù)據(jù)。文中的示例代碼講解清晰,具有一定的學(xué)習(xí)和工作價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2021-12-12
  • C++常用的11種設(shè)計(jì)模式解釋及示例代碼詳解

    C++常用的11種設(shè)計(jì)模式解釋及示例代碼詳解

    c++常用的設(shè)計(jì)模式包括單例模式、工廠模式、抽象工廠模式、適配器模式、裝飾者模式、代理模式、外觀模式、橋接模式、組合模式、享元模式、觀察者模式和命令模式等,這篇文章主要介紹了C++常用的11種設(shè)計(jì)模式解釋及示例,需要的朋友可以參考下
    2023-02-02

最新評(píng)論

高邑县| 深水埗区| 佛教| 江西省| 灌云县| 海安县| 阜新| 深水埗区| 会昌县| 伊宁县| 射阳县| 双鸭山市| 松江区| 弋阳县| 醴陵市| 泗水县| 永春县| 依兰县| 敦煌市| 阜南县| 北川| 雅江县| 遂川县| 新乐市| 定兴县| 望城县| 汾西县| 丰顺县| 福建省| 古浪县| 赤壁市| 奎屯市| 临桂县| 南和县| 安宁市| 耿马| 桑植县| 达拉特旗| 阿拉尔市| 青浦区| 郎溪县|