Decoartor.h
#ifndef _DECOARTOR_H_
#define _DECOARTOR_H_
class CComponent
{
public:
CComponent();
virtual ~CComponent();
virtual void Operator()=0;
private:
};
class CConcereteComponent:public CComponent
{
public:
CConcereteComponent();
~CConcereteComponent();
void Operator();
};
class CDecoartor:public CComponent
{
public:
CDecoartor(CComponent *_com);
virtual ~CDecoartor();
virtual void Operator()=0;
private:
protected:
CComponent *_com;
};
class CConcerteDecorator:public CDecoartor
{
public:
CConcerteDecorator(CComponent *_com);
~CConcerteDecorator();
void Operator();
void AddBehaiveOperator();
private:
};
#endif
Decoator.cpp
#include <iostream>
#include <assert.h>
#include "Decorator.h"
using namespace std;
CComponent::CComponent()
{
}
CComponent::~CComponent()
{
}
CConcereteComponent::CConcereteComponent()
{
}
CConcereteComponent::~CConcereteComponent()
{
}
void CConcereteComponent::Operator()
{
cout<<"CConcereteComponent Operator"<<endl;
}
CDecoartor::CDecoartor(CComponent *_com)
{
assert(_com);
this->_com=_com;
}
CDecoartor::~CDecoartor()
{
}
void CDecoartor::Operator()
{
cout<<"CDecoartor Operator"<<endl;
}
CConcerteDecorator::CConcerteDecorator(CComponent *_com):CDecoartor(_com)
{
}
CConcerteDecorator::~CConcerteDecorator()
{
}
void CConcerteDecorator::Operator()
{
assert(_com);
_com->Operator();
this->AddBehaiveOperator();
}
void CConcerteDecorator::AddBehaiveOperator()
{
cout<<"CConcerteDecorator AddBehaiveOperator"<<endl;
}
Main.cpp
#include "Decorator.h"
int main()
{
CComponent *com= new CConcereteComponent;
CDecoartor *dec= new CConcerteDecorator(com);
dec->Operator();
delete dec;
return 0;
}
Decorator模式除了采用组合的方式取得了比采用继承方式更好的效果,Decorator模式还给设计带来一种“即用即付”的方式来添加职责。在OO设计和分析经常有这样一种情况:为了多态,通过父类指针指向其具体子类,但是这就带来另外一个问题,当具体子类要添加新的职责,就必须向其父类添加一个这个职责的抽象接口,否则是通过父类指针是调用不到这个方法了。这样处于高层的父类就承载了太多的特征(方法),并且继承自这个父类的所有子类都不可避免继承了父类的这些接口,但是可能这并不是这个具体子类所需要的。而在Decorator模式提供了一种较好的解决方法,当需要添加一个操作的时候就可以通过Decorator模式来解决,你可以一步步添加新的职责。