装饰模式(Decorator)
意图
动态的给一个对象添加一些额外的职责。
Decorator模式添加功能比生成子类更为灵活。
Head First设计模式
类图
参与者
- Component
定义一个对象接口,可以给这些对象动态地添加职责 - ConcreteComponent
定义一个对象,可以个这个对象添加一些职责 - Decorator
维持一个指向Component对象的指针,并定义一个与Component的接口一致的接口 - ConcreteDecorator
向组件添加职责
代码
#include <iostream>
#include <string>
using namespace std;
class Component
{
public:
virtual void Operation() = 0;
};
class ConcreteComponent:public Component
{
public:
void Operation()
{
cout<<"具体对象的操作 ConcreteOp"<<endl;
}
};
class Decorator:public Component
{
protected:
Component *pComp;
public:
void SetComponent(Component *pComp)
{
this->pComp = pComp;
}
void Operation()
{
if(pComp != NULL)
{
pComp->Operation();
}
}
};
class ConcreteComponentA:public Decorator
{
private:
string addState; //添加的新状态
public:
ConcreteComponentA(string state)
{
this->addState = state;
}
void Operation()
{
Decorator::Operation();//调用父类方法
cout<<"A 装饰类: "<<endl;
cout<<"添加了的新状态: "<<this->addState<<endl;
}
};
class ConcreteComponentB:public Decorator
{
private:
string addState; //添加的新状态
void AddedOperation()
{
cout<<"添加了的新职责BFun"<<endl;
}
public:
void Operation()
{
Decorator::Operation();//调用父类方法
cout<<"B 装饰类:"<<endl;
AddedOperation();
}
};
int main()
{
ConcreteComponent *pConComp = new ConcreteComponent();
ConcreteComponentA *pConCompA = new ConcreteComponentA("Astate");
ConcreteComponentB *pConCompB = new ConcreteComponentB();
pConCompA->SetComponent(pConComp);
pConCompB->SetComponent(pConCompA);
pConCompB->Operation();
}
Head First设计模式
- 运行时扩展,远比编译时期的继承威力大
- 装饰模式可以使你在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责