1. 程式人生 > >設計模式之:裝飾模式

設計模式之:裝飾模式

裝飾模式UML圖
裝飾模式用於動態的往元件(Component)上新增功能。主要使用的場所為:

  • 需要擴充套件一個類的功能,或給一個類增加附加責任。
  • 需要動態的給一個物件增加功能,這些功能可以再動態地撤銷。
  • 需要增加一些基本功能的排列組合而產生的非常大量的功能。

就上圖而言,待擴充套件的類就是ConcreteComponent,附屬的職責或者功能就是ConcreteDecorator身上帶有的工能。裝飾模式比較強大的地方在於:1)可以動態新增或者撤銷職責或者功能。2)可以實現功能的排列組合而不用通過繼承的方式。

這裡寫圖片描述
舉一個穿衣服的例子,UML圖如上,程式碼如下:

#include <string>
#include <unordered_set> #include <iostream> using namespace std; class CAbstractAvator { public: virtual void Decorate() = 0; }; class CConcreteAvator : public CAbstractAvator{ string m_name; public: CConcreteAvator(const string& name) : m_name(name) {} void Decorate() override
{ cout << "I'm " << m_name << ", I'm wearing: " << endl; } }; class CAbstractDecorator : public CAbstractAvator{ protected: CAbstractAvator* pAvator = nullptr; public: CAbstractDecorator(CAbstractAvator* p) : pAvator(p) {} }; class CUnderWearDecorator : public
CAbstractDecorator { public: CUnderWearDecorator(CAbstractAvator* p) : CAbstractDecorator(p) {} void Decorate() override { pAvator->Decorate(); cout << "Underwear" << endl; } }; class CTshirtDecorator : public CAbstractDecorator { public: CTshirtDecorator(CAbstractAvator* p) : CAbstractDecorator(p) {} void Decorate() override { pAvator->Decorate(); cout << "Tshirt" << endl; } }; class CSweatersDecorator : public CAbstractDecorator { public: CSweatersDecorator(CAbstractAvator* p) : CAbstractDecorator(p) {} void Decorate() override { pAvator->Decorate(); cout << "Sweaters" << endl; } }; class CCoatDecorator : public CAbstractDecorator { public: CCoatDecorator(CAbstractAvator* p) : CAbstractDecorator(p) {} void Decorate() override { pAvator->Decorate(); cout << "Coat" << endl; } }; void main() { CAbstractAvator *pAvator = new CConcreteAvator("avator"); pAvator = new CUnderWearDecorator(pAvator); pAvator = new CTshirtDecorator(pAvator); pAvator = new CSweatersDecorator(pAvator); pAvator = new CCoatDecorator(pAvator); pAvator->Decorate(); }

輸出結果如下:

I'm avator, I'm wearing:
Underwear
Tshirt
Sweaters
Coat

相關推薦

設計模式裝飾模式

裝飾模式用於動態的往元件(Component)上新增功能。主要使用的場所為: 需要擴充套件一個類的功能,或給一個類增加附加責任。 需要動態的給一個物件增加功能,這些功能可以再動態地撤銷。 需要增

C#設計模式裝飾模式

裝飾模式(Decorator): 動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生在子類更為靈活 UML類圖 Component 是定義一個物件介面,可以給這些

c# 設計模式 裝飾模式

如果 透明 組件 通過 繼續 color [] 接收 lin 一、引言 在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給手機添加貼膜,手機掛件,手機外殼等,如果此時利用繼承來實現的話,就需要定義無數的類,如StickerPhone(貼膜是手機類)、Accesso

php設計模式裝飾模式

decorator tac coff cti cor ring 咖啡 parent namespace Beverage.php <?php namespace DesignPattern; abstract class Beverage { /**

設計模式模式PK裝飾模式VS適配器模式

角度 朋友 hit 擴展 override 轉換 展現 調用 代理 1、概述 裝飾模式和適配器模式在通用類圖上沒有太多的相似點,差別比較大,但是它們的功能有相似的地方:都是包裝作用,都是通過委托方式實現其功能。不同點是:裝飾模式包裝的是自己的兄弟類,隸屬於同一個家族(相同接

Java設計模式20 —— 裝飾模式(1)

裝飾模式是一種結構型設計模式。其使用一種對客戶端透明的方式,來動態的擴充套件物件的功能。同時,它也是繼承關係的一種替代方案之一。定義:動態地給一個物件新增一些額外的職責。就增加個來說,裝飾模式比生成子類更為靈活。 所以,我們可以在需要透明而且動態地擴充套件類的功能時,所以裝

Java設計模式20 —— 裝飾模式(2)

裝飾模式是一種結構型設計模式。其使用一種對客戶端透明的方式,來動態的擴充套件物件的功能。同時,它也是繼承關係的一種替代方案之一。定義:動態地給一個物件新增一些額外的職責。就增加個來說,裝飾模式比生成子類更為靈活。 所以,我們可以在需要透明而且動態地擴充套件類的功能時,所以裝

設計模式工廠模式(factory)

工廠模式factory 工廠模式其主旨在於將物件的建立過程抽取(抽象)出來,形成專門用於統一建立物件的類; 根據不同的建立要求,建立所需要的物件; C++實現 #include<i

C#設計模式備忘錄模式

備忘錄模式(Memento) 在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態 UML 程式碼 class Mem

C#設計模式命令模式

命令模式Command 將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤銷操作。 UML 程式碼 abstract class Command

大話設計模式原型模式

一.模式定義 原型模式是物件建立型模式。 Prototype Pattern: Specify the kind of objects to create using a prototypical instance, and create new objects by c

Java23種設計模式策略模式和工廠模式

因為目前產品用到了策略模式,比如國內的使用者註冊走A流程,美國使用者走B流程,印度使用者走C流程,每個流程有些相同,有些則完全不一樣。 這兩種設計模式非常容易弄混淆。   策略模式和工廠模式: 1. 關注點不一樣,工廠模式關注物件建立,策略模式關注行為封裝 2.解決的問題不

設計模式工廠模式

目錄 一. 簡單工廠模式 本質 優點 缺點 程式碼示例: 二.抽象工廠模式 本質 優點 缺點 程式碼示例 參考連線: 工廠設計模式的實現是一個不屬於任何類的單一函式,負責單一種類物件的建立。 一. 簡單工廠模式 本質 給一個函式傳遞不同

設計模式代理模式

前言 代理模式的本質就是隱藏真實角色資訊,實現間接接觸。比如我們平常在租房時會找中介,中介就相當於一個代理,房東和租戶直接聯絡的都是中介。 代理模式有3個必要的元素: 真實的物件(執行業務邏輯,被代理的物件) 代理類(使用者請求的一個介面,對真實目標的保護) 使用者(獲

設計模式八 --- 裝飾模式(Decorator)

【1】基本概念           裝飾模式(Decorator),動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 【2】簡單分析           我們先來看下該設計模式的UML結構圖 上圖是Decorator 模式的結構圖,讓我們可

java常用設計模式裝飾模式

一、概念  裝飾模式可以在不改變一個物件本身功能的基礎上給物件增加額外的新行為。 基本角色: 抽象構件:它是具體構件和抽象裝飾類的共同父類,聲明瞭在具體構件中實現的業務方法,它的引入可以使客戶端以一致的方式處理未被裝飾的物件以及裝飾之後的物件,實現客戶端的透明操作。 具體構件:它是抽

c# 設計模式 工廠模式---工廠模式

gas exec load common pre bubuko 技術分享 ron deb 1、uml類圖: 實現和依賴關系: 實現:   SportFactory、JeepFactory、HatchbackFactory 實現 IFactory 接口   SportCa

Java描述設計模式(09)裝飾模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、場景描述 孫悟空有七十二般變化,他的每一種變化都

C#設計模式結構類模式裝飾模式

負責 gzip null pattern 產生 設計師 san 抽象 接口 定義(Decorator Pattern): 動態的給一個對象添加一些額外的職責。就添加功能來說,它相比生成子類更為靈活。 一、引言 在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給手

設計模式學習裝飾模式

  最近在總結學習Java I/O相關知識點,I/O應用的場景比較多,不僅存在各種I/O源端和想要與之通訊的接收端(檔案、控制檯、網路連結等),而且還需要支援多種不同方式的通訊(順序、隨機存取、緩衝、二進位制、按字元、按行、按字等)。   Java類庫的設計者通過建立大量的類來解決這個難題,這裡面用到了裝飾器