专业编程基础技术教程

网站首页 > 基础教程 正文

c++设计模式之装饰器模式

ccvgpt 2024-08-04 12:15:43 基础教程 8 ℃

装饰器模式是一种结构型设计模式,它提供了一种替代继承关系的方法。装饰器模式通过新定义类,并让这个类包含要装饰的对象类,同时添加新定义的附加功能在这个定义类中,也就是说,实际对象被包装在装饰器类的实例中。装饰器类实现了与实际对象相同的接口,并且可以添加额外的行为。

装饰器模式在不改变原有类结构的基础上,灵活动态地在原有类基础上扩展新的功能。可以按照需要选择、按顺序使用不同的装饰者来包装对象,从而达到组合各种功能的目的。装饰器模式实现了功能的扩展和复用,同时也避免了使用继承带来的静态特性和多个子类的维护问题。

c++设计模式之装饰器模式

使用装饰器的意义

功能扩展,可以动态的给一个对象添加一些额外的功能。

对比通过子类继承的方式,如果后续继续增加功能的话,便要继续继承现有的类,如此就会使继承的层次越来越深,不利于代码的维护和可读性。

降低代码之间的耦合性,提高了灵活性和扩展性。

实现步骤

抽象组件类---抽象被装饰者的行为

一个或多个具体组件类---被装饰者的行为具体实现

抽象装饰器类---与抽象组件一致接口

具体的装饰器类---为具体组件附加功能

代码示例

//抽象组件
class Component
{
public:
     virtual void Operation() = 0;
};

//具体组件
class ConcreteComponent : public Component
{
public:
     void Operation()
     {
          cout<<"ConcreteComponent"<<endl;
     }
};

//抽象装饰器
class Decorator : public Component
{
public:
     Decorator(Component *pComponent) : m_pComponent(pComponent) {}
     void Operation()
     {
          if (m_pComponent!= NULL)
          {
               m_pComponent->Operation();
          }
     }
protected:
     Component *m_pComponent;
};

//具体装饰器A
class ConcreteDecoratorA : public Decorator
{
public:
     ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}
     void Operation()
     {
          AddedBehavior();
          Decorator::Operation();
     }
     void  AddedBehavior()
     {
          cout<<"Added behaviorA."<<endl;
     }
};
//具体装饰器B
class ConcreteDecoratorB : public Decorator
{
public:
     ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}
     void Operation()
     {
          AddedBehavior();
          Decorator::Operation();
     }
     void  AddedBehavior()
     {
          cout<<"Added behaviorB."<<endl;
     }
};

//main函数
int main()
{
    Component* component = new ConcreteComponent();
    Decorator* decorateA = new ConcreteDecoratorA(component);
    Decorator* decorateB = new ConcreteDecoratorB(decorateA);
    decorateB->Operation();
    delete  decorateB;
    delete  decorateA;
    delete  component;
    return 0;
}

最近发表
标签列表