1 適用性
\• 在不影響其他對象的情況下,以動態、透明的方式給單個對象添加一些職責,如:加密層,解密層。
• 處理那些可能偶爾才會用到的特性接口
• 當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持
每一種組合將產生大量的子類,使得子類數目呈爆炸性增長
#include "stdafx.h"
#include <iostream>
using namespace std;
class Component //被裝飾者抽象類
{
public:
virtual void Draw() = 0;
};
class Decorator : public Component //被裝飾者基類
{
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 //滾動條裝飾
{
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())); //同時裝飾上邊框和滾動條的組件
c2->Draw();
delete c3;
system("pause");
return 0;
}
posted on 2009-01-16 15:58
黑色天使 閱讀(378)
評論(0) 編輯 收藏 引用 所屬分類:
設計模式