Decorator

来源:互联网 发布:软件质量保证计划表 编辑:程序博客网 时间:2024/05/21 08:38

//动态添加需求
//Decorator模式,又叫装饰模式,就是给一个对象额外地添加一些职责,以适应更多的变化。

//你或许写一个Door
//的子类AlarmDoor ,在里面添加一个子类独有的方法alarm() 。而当你的系统仅仅在一两个地方使用了警报门,这明
//显是不合理的——虽然可以使用缺省适配器来弥补一下。 这时候,你可以考虑采用装饰模式来给门动态的添加些额外的功能。

//1)  抽象构件角色(Component ):定义一个抽象接口,以规范准备接收附加责任的对象。
//2)  具体构件角色(Concrete Component):这是被装饰者,定义一个将要被装饰增加功能的
//    类。
//3)  装饰角色(Decorator):持有一个构件对象的实例,并定义了抽象构件定义的接口。
//4)  具体装饰角色(Concrete Decorator):负责给构件添加增加的功能。

//应用环境
//     GOF 书中给出了以下使用情况:
//1)  在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
//2)  处理那些可以撤消的职责。
//3)  当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持
//    每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类
//    定义被隐藏,或类定义不能用于生成子类。


//装饰模式(Decorator)也叫包装器模式(这个最形象 )。
//给一个对象添加职责,可以直接修改这个对象,但是这样就变得很危险。本着最大限度不修改原有代码的编码指导思想,应该对这个对象进行包装,
//再赋予新的对象额外的职责。就如一个步兵有杀伤敌人的功能,再把他装进战车,就额外拥有移动快、防御强的功能了。
#include <stdio.h>
class Component
{
public:
 virtual ~Component();

 virtual void Operation();
protected:
 Component();
private:
};

class ConcreteComponent:public Component
{
public:
 ConcreteComponent();

 ~ConcreteComponent();

 void Operation()
 {
  printf("ConcreteComponent operation...");
 }
protected:
private:
};

class Decorator:public Component
{
public:
 Decorator(Component* com)
 {
  this->_com = com;
 }

 virtual ~Decorator()
 {
  delete _com;
 }

 void Operation();
protected:
 Component* _com;
private:
};

class ConcreteDecorator:public Decorator
{
public:
 ConcreteDecorator(Component* com):Decorator(com){}

 ~ConcreteDecorator();

 void Operation()
 {
  _com->Operation();
  this->AddedBehavior();
 }

 void AddedBehavior()//动态的添加些额外的功能。
 {
  printf("ConcreteDecorator::AddedBehacior....");
 }
protected:
private:
};

void Decorator_test()
{
 Component* com = new ConcreteComponent();//(Concrete Component):这是被装饰者,定义一个将要被装饰增加功能的  类。

 Decorator* dec = new ConcreteDecorator(com);

 dec->Operation();//调用的是包装器

 delete dec;
}

原创粉丝点击