<pre name="code" class="cpp">
<span style="font-size:18px;">// test01.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include<string>
#include<stdio.h>
using namespace std;
//抽象基类,定义一个对象接口,可以为这个接口动态的添加职责
class Component
{
public:
Component() {}
virtual ~Component() {}
//纯虚函数,由派生类实现
virtual void Operation() = 0;
};
//派生自Component,在这里表示需要给它动态添加职责的类
class ConcreteComponent :public Component
{
public:
ConcreteComponent() {};
~ConcreteComponent() {};
void Operation()
{
cout << "ConcreteComponent operator.." << endl;
}
};
//抽象基类,维护一个指向Component对象的指针
class Decorator :public Component
{
public:
Decorator(Component *com)
{
this->_com = com;
}
void Operation() { };
virtual ~Decorator()
{
//delete _com;
}
protected:
Component *_com;
};
//派生自Decorator,用来装饰ConcreteComponent类(这里ConcreteComponent类只是基类Component派生出的一个类,也可以是其他类)
class ConcreteDecoratorA :public Decorator
{
public:
ConcreteDecoratorA(Component *com) :Decorator(com) {};
virtual void Operation()
{
_com->Operation();
AddedBehaviorA();
}
void AddedBehaviorA()
{
cout << "ConcreteDecoratorA::AddedBehaviorA..." << endl;
}
virtual ~ConcreteDecoratorA() {}
};
//也是派生自Decorator,用来装饰ConcreteComponent类
class ConcreteDecoratorB:public Decorator
{
public:
ConcreteDecoratorB(Component *com) :Decorator(com) {};
virtual void Operation()
{
_com->Operation();
AddedBehaviorB();
}
void AddedBehaviorB()
{
cout << "ConcreteDecoratorB::AddedBehaviorB..." << endl;
}
virtual ~ConcreteDecoratorB() {}
};
int main()
{
//初始化一个ConcreteComponent对象
ConcreteComponent *com = new ConcreteComponent();
//采用这个ConcreteComponent对象去初始化一个ConcreteDecoratorA对象
//这样就可以为这个Component对象动态添加职责
ConcreteDecoratorA *decA = new ConcreteDecoratorA(com);//装饰A
ConcreteDecoratorB *decB = new ConcreteDecoratorB(decA);//装饰B
decB->Operation();
delete com;
delete decA;
delete decB;
return 0;
} </span>
装饰模式的关键点:在Decorator里面定义了一个Compontent 定义了一个指向Component的指针,从而可以实现多态,动态绑定各个派生类。
PS.如果只有一个ConcreteComponent类,就可以不需要Component这个抽象类,这样直接让Decorator类继承ConcreteComponent类就可以了。同样的道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独Decorator类,而可以把Decorator类和ConcreteDecorator类的责任合并成一个类。