设计模式之Decoartor模式

来源:互联网 发布:网络创世纪单机版 编辑:程序博客网 时间:2024/06/07 09:07
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模式来解决,你可以一步步添加新的职责。



原创粉丝点击