設計模式 裝飾器模式(Decorator)

2021-09-24 09:33:32 字數 1725 閱讀 9288

裝飾器模式就是在不改變原有類或函式的基礎上,增強該類或函式的功能,增強後會生成新的類或函式。如果用過python的裝飾器就更好理解了,道理是一樣的。

假設我們有個基類叫shape,如下,

class

shape

;

現在有個circle類,繼承shape基類,如下,

class

circle

:public shape

virtual string str()

float

getradius()

void

setradius

(float newradius)

private

:float m_radius

};

現在我們想給這個circle新增顏色,在不改變原有circle類的基礎上,我們使用裝飾器模式來操作。首先,需要定義乙個裝飾器類,coloredshape,如下,

class

coloredshape

:public shape

, color

string str()

const override

private

: shape& m_shape;

string m_color;

};

這個類裡有個shape引用叫m_shape,用來指向被裝飾的shape類,我們使用時要生成circle類物件,然後把這個類物件傳給裝飾器類的建構函式來構造出乙個新類,如下,

circle circle

; coloredshape redcircle

; cout << redcircle.

str(

)<< endl;

這樣我們新得到的類redcircle就具有顏色效果了,當然也可以在裝飾器類裡新增很多其它功能。

這裡有個小問題,circle類還有其它成員函式,這樣裝飾後新的類無法使用circle的剩餘成員函式,因為這些函式不是基類裡定義的。那怎麼辦呢?先挖個坑,以後再填。

尾 完整**

#include

#include

#include

using

namespace std;

class

shape

;class

circle

:public shape

virtual string str()

float

getradius()

void

setradius

(float newradius)

private

:float m_radius;};

class

coloredshape

:public shape

, m_color

virtual string str()

private

: shape& m_shape;

string m_color;};

intmain()

; coloredshape redcircle

; cout << redcircle.

str(

)<< endl;

return0;

}

設計模式 裝飾器模式

裝飾器模式 decorator pattern 允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。public inte ce playe...

設計模式 裝飾器模式

裝飾者模式的應用場景 裝飾者模式 decorator pattern 是指在不改變原有物件的基礎之上,將功能附加到物件上,提供了比繼承更有彈性的替代方案 擴充套件原有物件的功能 屬於結構型模式。裝飾者模式在我們生活中應用也比較多如給煎餅加雞蛋 給蛋糕加上一些水果 給房子裝修等,為物件擴充套件一些額外...

設計模式 裝飾器模式

定義 裝飾模式可以動態的給乙個物件增加一些額外的功能 增強功能 相比於繼承,裝飾模式能對不支援繼承的類進行增強 並且比繼承更靈活,不需要生成大量的子類。角色 實現 public abstract class house public abstract void sleep public class ...