意图
动态的给一个对象添加一些额外的职责。
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();
}
# 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设计模式
- 运行时扩展,远比编译时期的继承威力大
- 装饰模式可以使你在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责