1. 程式人生 > >最常用的設計模式---裝飾者模式(C++實現)

最常用的設計模式---裝飾者模式(C++實現)

      上一篇說了介面卡模式,這一篇接著學習裝飾者模式。

    想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選擇。      裝飾者模式主要實現的功能是動態的給某一個類新增一些額外的功能,它是一個錦上添花者。想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選擇。設計模式的原則是多用組合少用繼承。

uml 圖:


特點:
     1. 裝飾者和被裝飾者擁有相同的超型別(可能是抽象類也可能是介面)
     2. 可以用多個裝飾類來包裝一個物件,裝飾類可以包裝裝飾類或被裝飾物件
     3. 因為裝飾者和被裝飾者擁有相同的抽象型別,因此在任何需要原始物件(被包裝)的場合,都可以用裝飾過的物件來替代它。
     4. 裝飾者可以在被裝飾者的行為之前或之後,加上自己的附加行為,以達到特殊目的
      5. 因為物件可以在任何的時候被裝飾,所以可以在執行時動態地、不限量地用你喜歡的裝飾者來裝飾物件

案例分析

      假如你老婆喜歡化妝,她每天早上照鏡子著鏡子都化妝,化妝的時候要塗口紅,畫睫毛,抹香水。老婆化妝的這個過程便是一個典型的裝飾者模式,而口紅,眼線筆,香水,顯然就是裝飾品。

首先是愛照鏡子的女人:

class IWomen
{
public:
	virtual void lookIntoTheMirror() = 0;
};

然後老婆是個愛照鏡子的喜歡打扮的女人(具體需要裝飾物件)
class Wife : public IWomen
{
public:
	void lookIntoTheMirror()
	{
		cout<<"鏡子中的老婆 "<<endl;
	}
};
 

需要一個化妝的女人(裝飾品的抽象基類)

class DecoratorWomen : public IWomen
{
public:
	DecoratorWomen(IWomen* woman)
		:m_women(woman)
	{

	}

	void lookIntoTheMirror()
	{
		m_women->lookIntoTheMirror();
		makeUp();
	}
	virtual void makeUp() = 0; //化妝
protected:
	IWomen* m_women;
};

下面是具體3種用於化妝的化妝品: 口紅,睫毛膏,香水
class Lipstick : public DecoratorWomen
{
public:
	Lipstick(IWomen* woman):DecoratorWomen(woman){};
	void makeUp()
	{
		cout<<"  有火紅的嘴脣!";
	}
};


class Mascara : public DecoratorWomen
{
public:
	Mascara(IWomen* woman):DecoratorWomen(woman){};
	void makeUp()
	{
		cout<<"  有黑黑的睫毛!";
	}
};

class Perfume : public DecoratorWomen
{
public:
	Perfume(IWomen* woman):DecoratorWomen(woman){};
	void makeUp()
	{
		cout<<"  有香奈兒的味道!";
	}
};
客戶端,老婆照鏡子
	IWomen* myWife = new Wife();
	Lipstick* lips = new Lipstick(myWife);
	Mascara* mas = new Mascara(lips);
	Perfume* per = new Perfume(mas);
	myWife = per;
	myWife->lookIntoTheMirror();
        //釋放各種資源...

介面卡模式和裝飾者模式的區別:     介面卡將一個物件包裝起來以改變其介面;裝飾者將一個物件包裝起來以增強新的行為和責任;而外觀將一群物件包裝起來以簡化其介面。要注意裝飾著模式的兩個抽象類,一個是Compent, 還有一個是Decorator。

相關推薦

大流之Ford-Fulkerson演算法C++實現

本文主要講解最大流問題的Ford-Fulkerson解法。可是說這是一種方法,而不是演算法,因為它包含具有不同執行時間的幾種實現。該方法依賴於三種重要思想:殘留網路,增廣路徑和割。 一、殘留網路 顧名思義,殘留網路是指給定網路和一個流,其對應還可以容納的流組成的網路。具體說來,就是假定一個網

可能是你容易看明白的快速排序C++實現

我認為現在CSDN大多關於快速排序的程式都是在扯淡。不是針對某一位,我是說,我看到CSDN的C++快排程式都是扯淡。他們根本沒有把重點放在快速排序本身,為什麼我這麼說?我們往下看。快排的本質思想就是分而治之。舉例說明,我們要對3 5 2 1 4進行排序。首先我們選中一個數字當

常用設計模式---裝飾模式C++實現

      上一篇說了介面卡模式,這一篇接著學習裝飾者模式。     想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選擇。      裝飾者模式主要實現的功能是動態的給某一個類新增一些額外的功能,它是一個錦上添花者。想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選

Java設計模式---裝飾模式用生活例子解釋通過裝飾類物件對方法進行實現介面的方法增強

裝飾者模式可以動態地給一個物件新增一些額外的職責。 就增加功能來說,Decorator模式相比生成子類更為靈活。 該模式的適用環境為: (1)在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責。 (2)處理那些可以撤消的職責。 (3)當不能採用生成子

javascript設計模式-裝飾模式9

裝飾者是一種為物件新增新特性的技術,它並不適用建立新子類的這種手段。裝飾者模式可以用來透明的把物件包裝在具有同樣介面的另一個物件之中。這樣我們就可以為物件新增一個方法或者一些行為,然後將方法呼叫傳

34C#設計模式——裝飾模式Decorator Pattern

引言 在軟體開發中,我們經常想要對一類物件新增不同的功能,例如要給手機新增貼膜、掛件、外殼等。如果此時使用繼承來實現的話,我們就需要定義無數的類,這樣會導致“子類爆炸”的問題。為了解決這個問題,可以使用裝飾者模式來動態地給一個物件新增額外的職責。 裝飾者模式的詳細介紹

設計模式----裝飾模式decorator pattern

SchoolReport.java程式碼如下:package com.designPattern.decorator;public abstract class SchoolReport { public abstract void report(); public abst

常用設計模式---模板方法模式C++實現

模板方法模式是設計模式行為型中最簡單的一種設計模式。在實際中你甚至可能經常用到,只是你自己不知道它是一種設計模式罷了。 模板方法模式定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 角色:抽

設計模式-裝飾模式問題比較大,需要重新處理

設計原則:類應該對擴充套件開放,對修改關閉。在不修改現有程式碼的情況下,拓展,搭配新的行為。設計更加彈性應對改變,可以接受新的功能應對改變的需求。 遵循開放關閉原則會引入程式碼抽象層次,增加程式碼的複雜度。我們的注意力是在於設計中最有可能發生改變的地方,然後應用開放關閉原

設計模式--裝飾模式在IO體系中的應用

上一篇介紹了介面卡模式,它是將一個類的介面,轉化成客戶期望的另一個介面,介面卡讓原本介面不相容的類可以合作無間。裝飾者模式:動態的將責任附加到物件上(因為利用組合而不是繼承來實現,而組合是可以在執行時進行隨機組合的)用來擴充套件功能。若要擴充套件功能,裝飾者提供

常用設計模式---介面卡模式C++實現

介面卡模式屬於結構型的設計模式,它是結構型設計模式之首(用的最多的結構型設計模式)。 介面卡設計模式也並不複雜,介面卡它是主要作用是將一個類的介面轉換成客戶希望的另外一個介面這樣使得原本由於介面不相容而不能一起工作的那些類可以一起工作。介面卡模式有兩種:1.類的介面卡 2.

設計模式——觀察模式C++實現

ace mes des ret rtu cto pattern virt date 1 #include <iostream> 2 #include <vector> 3 #include <algorithm>

Java設計模式裝飾模式

解決 over 裝飾者模式 pack img 應該 ora 我們 lan 目錄      一、問題引入  二、設計原則  三、用裝飾者模式解決問題  四、裝飾者模式的特點  五、裝飾者模式的定義  六、裝飾者模式的實現  七、java.io包內的裝飾者模式

設計模式——中介模式/調停模式C++實現

con 分享 else .cn sign name 得到 ted esp 1 #include <iostream> 2 #include <string> 3 4 using namespace std;

javascript設計模式——裝飾模式

應用 提交表單 不同 ora fin input 是否為空 插件 和數 前面的話   在程序開發中,許多時候都並不希望某個類天生就非常龐大,一次性包含許多職責。那麽可以使用裝飾者模式。裝飾者模式可以動態地給某個對象添加一些額外的職責,而不會影響從這個類中派生的其他對象。本

C# - 設計模式 - 裝飾模式

private 實現類 comm 回路 匯總 abs round C# 由於 裝飾者模式 問題場景 如果要計算一杯咖啡的價格,只需要調用其獲取價格的方法就可以了,但是如果需要加一些材料,比如牛奶、巧克力、糖等等,這些材料也必須返回它們價格以便於用於匯總計算,但是材料有很

設計模式——裝飾模式

什麽 很多 方法 info 改變 劃分 llb 設計 nts - 什麽是裝飾者模型 裝飾者模型通過組合的方式擴展對象的特性,動態地給對象添加額外的職責。在增加功能上,裝飾模式比生成子類更加靈活。 - 職責劃分 Component抽象構建,是接口或者抽象類,就是定義原始對象

C#設計模式——裝飾模式

方式 實例 oid spa als note 客戶 基本功 pan 一、裝飾者模式介紹: 裝飾者模式——以對客戶透明的方式動態地給一個對象添加額外的職責,采用對象組合而非繼承的方式實現了再運行時動態地擴展對象功能的能力,相比生成子類可以更靈活地增加功能,而且可以根據需要擴展

設計模式-裝飾模式(Go語言描述)

什麼是裝飾者模式 好久沒有更新設計模式系列的部落格了, 今天我們來聊一聊裝飾者模式, 用過java的同學肯定對裝飾者模式非常熟悉,就算你不知道什麼是裝飾者模式這概念, 你也一定在程式碼中經常用到這個模式,為什麼這麼說呢? 大家都用過java中的流吧, 我們可以這樣寫: new B

android設計模式——裝飾模式

定義:允許向一個現有的物件新增新的功能,同時又不改變其結構。 使用場景:能夠動態地擴充套件類的功能 應用舉例:一個畫可以被裝在畫框裡,並且被蒙上玻璃,這時候畫,玻璃,畫框組成了一個東西。 類圖: Comppoent: 抽象元件 ConcreteComponet:元件的具體