装饰模式----C++实现

2014-11-24 07:36:09 · 作者: · 浏览: 0

装饰模式

定义:

动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

适用性:

1、 在不影响其他对象的情况下,以动态,透明的方式给单个对象添加职责。

2、 处理那些可以撤销的职责

3、 当不能采用生成子类的方法扩充是。

优点:

1、 比静态继承更灵活

2、 避免在层次结构高层的类有太多的特征

结构:

\

实现:

class Component

{

public:

Component(){};

virtual~Component(){};

virtual void doSomething() = 0;

};

class A:public Component

{

public:

voiddoSomething(){}

protected:

private:

};

class ConcreteComponent:public Component

{

public:

ConcreteComponent(){}

~ConcreteComponent(){}

voiddoSomething()

{

cout<<"ConcreteComponent doSomething"<

}

};

class Decorator:public Component

{

public:

Decorator(Component*pcomponent):m_pComponent(pcomponent)

{ }

~Decorator(){}

//直接调用被装饰组件

voiddoSomething()

{

m_pComponent->doSomething();

}

private:

Component *m_pComponent;

};

//给ConcreteComponent添加了额外的状态

class ConcreteDecoratorA:public Decorator

{

public:

ConcreteDecoratorA(Component*pcomponent,string name):Decorator(pcomponent),m_name(name)

{ }

~ConcreteDecoratorA(){}

voiddoSomething()

{

cout<<"ConcreteComponent name :"<

Decorator::doSomething();

}

private:

//额外的状态

string m_name;

};

//给ConcreteComponent添加了额外的操作

class ConcreteDecoratorB:public Decorator

{

public:

ConcreteDecoratorB(Component*pcomponent):Decorator(pcomponent)

{ }

~ConcreteDecoratorB(){}

voiddoSomething()

{

doAdditionalThing();

Decorator::doSomething();

}

private:

//额外的职责

voiddoAdditionalThing()

{

cout<<"ConcreteDecoratorB doAdditionalThing "<

}

};

Component *pcom = new ConcreteComponent;

Decorator *pa = newConcreteDecoratorA(pcom,"componentA");

Decorator *pb = newConcreteDecoratorB(pcom);

pa->doSomething();

pb->doSomething();

实现中最重要的一点就是,装饰对象和被装饰的组件的接口是一致的。如果有多个装饰类,则所有的装饰类必须有一个公共的父类。