欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式——Decorator模式

程序员文章站 2024-02-09 15:49:58
...

装饰器模式——允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装,不是通过继承而是通过组合实现的。

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

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

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:多层装饰比较复杂。


代码示例(C++)

#include<iostream>
using namespace std;

//抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
class Component{
public:
    virtual ~Component();
    virtual void Operation()=0;

protected:
    Component(){}
};

Component::~Component(){
}

//具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
class ConcreteComponent:public Component
{
public:
    ConcreteComponent(){}
    ~ConcreteComponent(){}

    void Operation(){
        cout<<"ConcreteComponent Operation()"<<endl;
    }
};

//装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
class Decorator:public Component
{
public:
    Decorator(Component* com){
        this->_com=com;
    }

    virtual ~Decorator(){
        delete _com;
    }

    void Operation(){
    }

protected:
    Component* _com;
};

//具体装饰(Concrete Decorator)角色:负责给构件对象”贴上”附加的责任。
class ConcreteDecorator:public Decorator
{
public:
    ConcreteDecorator(Component* com):Decorator(com)
    {
    }

    ~ConcreteDecorator(){}

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

    void AddBehavior(){
        cout<<"ConcreteDecorator AddBehavior()"<<endl;
    }
};


int main(){
    Component* com1=new ConcreteComponent();
    Decorator* dec=new ConcreteDecorator(com1);
    dec->Operation();
    delete dec;

    return 0;
}
相关标签: 装饰器模式