設計模式學習-每日一記(9.裝飾者模式)

來源:互聯網
上載者:User

裝飾者模式

A.定義:

動態地給一個對象添加一些職責。就增加功能而言,裝飾者模式比產生子類更靈活。

B.定義分析:

"動態地給一個對象添加一些職責。就增加功能而言,裝飾者模式比產生子類更靈活。"我們知道,對象的職責定義在類中,類的方法決定了對象的職責.

"動態地給一個對象添加一些職責。就增加功能而言,裝飾者模式比產生子類更靈活。"裝飾者模式的意圖是不修改類,而是動態給對象添加職責.

"動態地給一個對象添加一些職責。就增加功能而言,裝飾者模式比產生子類更靈活。"裝飾者不修改類,而是動態給對象加,當然靈活.

C.問題:

(1)怎麼實現?

假設有類A和SubA,SubA繼承自A.A有個介面dress表示穿衣服.

 1 class A
2 {
3 virtual void dress(void) = 0;
4 };
5 class SubA : public A
6 {
7 void dress(void)
8 {
9 //穿T恤.
10 }
11 };

但是,我們突然間想要擴充下dress這個介面,但是有不想改變A和SubA。這時候,我們使用裝飾模式:

class DecoratorHat : public A
{
A* m_p;
DecoratorHat(A* p)
:A()
{
m_p = p;
}
void dress(void)
{
  //戴帽子
  m_p->dress();
}
};
class DecoratorGlass : public A
{
A* m_p;
DecoratorGlass(A* p)
:A()
{
m_p = p;
}
void dress(void)
{
  //戴眼鏡
  m_p->dress();
}
};

其中的DecoratorHat和DecoratorGlass就是裝飾者,用法可以是:

A* p = NULL;
p = new DecoratorHat(new DecoratorGlass(new SubA));
p->dress();

這時候,SubA就被裝飾咯.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.