您的位置:首页 > 其它

Decorator

2013-10-29 11:00 183 查看
//动态添加需求

//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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: