1 適用性
\• 在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加一些職責(zé),如:加密層,解密層。
• 處理那些可能偶爾才會(huì)用到的特性接口
• 當(dāng)不能采用生成子類(lèi)的方法進(jìn)行擴(kuò)充時(shí)。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持
每一種組合將產(chǎn)生大量的子類(lèi),使得子類(lèi)數(shù)目呈爆炸性增長(zhǎng)
#include "stdafx.h"
#include <iostream>
using namespace std;
class Component //被裝飾者抽象類(lèi)
{
public:
virtual void Draw() = 0;
};
class Decorator : public Component //被裝飾者基類(lèi)
{
public:
Decorator(Component *c) : _component(c){}
~Decorator() {delete _component;}
virtual void Draw() { if (_component) _component->Draw();}
private:
Component *_component;
};
//////////////////////////////////////////////////////////////////////////
class MyComponent : public Component //被裝飾者
{
public:
virtual void Draw() {cout << "MyComponent::Draw()" << endl;}
};
//////////////////////////////////////////////////////////////////////////
class BorderDecorator : public Decorator //邊框裝飾
{
public:
BorderDecorator(Component *c) : Decorator(c){}
virtual void Draw()
{
cout << "DrawBorder
" << endl;
Decorator::Draw();
}
};
class ScrollDecorator : public Decorator //滾動(dòng)條裝飾
{
public:
ScrollDecorator(Component *c) : Decorator(c){}
virtual void Draw()
{
cout << "DrawSrollbar
" << endl;
Decorator::Draw();
}
};
int main()
{
Component *c2 = new BorderDecorator(
new MyComponent()); //裝飾邊框的組件
c2->Draw();
delete c2;
Component *c3 = new ScrollDecorator(
new BorderDecorator(
new MyComponent())); //同時(shí)裝飾上邊框和滾動(dòng)條的組件
c2->Draw();
delete c3;
system("pause");
return 0;
}
posted on 2009-01-16 15:58
黑色天使 閱讀(378)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
設(shè)計(jì)模式