采用组合而非继承的手法,Decorator模式实现了在运行时动态扩展对象功能的能力,可以根据需要扩展功能。
Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类的所有接口。但在实现上又表现为has-a Component的组合关系,即Decorator类里有Component类的指针。
装饰者模式既有继承,又有组合。
Decorator模式主要解决 主体类在多个方向上的扩展功能,这就是装饰的含义。
框选部分存在大量重复代码以及子类泛滥的问题。本质上不是继承关系,所以使用继承关系就会出现此问题。正确的关系时来扩展。应该变为下图的关系。
#include <iostream>
#include <memory>
//抽象构件 定义了一个,用于规范具体构件和装饰者的行为
class Component {
public:
virtual void operation() = 0;
virtual ~Component() { std::cout << "Component析构函数" << std::endl; }
};
//ConcreteComponent是具体构件,实现了Component接口,它是被装饰的对象
class ConcreteComponent : public Component {
public:
void operation() {
std::cout << "ConcreteComponent::operation()" << std::endl;
}
virtual ~ConcreteComponent() { std::cout << "ConcreteComponent析构函数" << std::endl; }
};
//Decorator是装饰者,它实现了Component接口,并持有一个指向Component的指针
//,用于装饰Component对象,同时还可以自定义一些额外的行为
class Decorator : public Component {
public:
Decorator(Component* component) : m_component(component) {}
virtual ~Decorator() { std::cout << "Decorator析构函数" << std::endl; }
void operation() {
m_component->operation();
}
protected:
Component* m_component;
};
class ConcreteDecoratorA : public Decorator {
public:
ConcreteDecoratorA(Component* component) : Decorator(component) {}
~ConcreteDecoratorA() { std::cout << "ConcreteDecoratorA析构函数" << std::endl; }
void operation() {
Decorator::operation();
std::cout << "ConcreteDecoratorA::operation()" << std::endl;
}
};
class ConcreteDecoratorB : public Decorator {
public:
ConcreteDecoratorB(Component* component) : Decorator(component) {}
~ConcreteDecoratorB() { std::cout << "ConcreteDecoratorB析构函数" << std::endl; }
void operation() {
Decorator::operation();
std::cout << "ConcreteDecoratorB::operation()" << std::endl;
}
};
int main() {
std::unique_ptr<Component> component(std::move(new ConcreteComponent()));
component->operation();
std::unique_ptr<Component> concreteDecoratorA(new ConcreteDecoratorA(component.get()));
concreteDecoratorA->operation();
std::unique_ptr<Component> concreteDecoratorB(new ConcreteDecoratorB(concreteDecoratorA.get()));
concreteDecoratorB->operation();
return 0;
}
装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时动态地添加功能到类中,避免了通过继承来实现功能增强的复杂度。
装饰者模式的应用场景包括:
- 当需要在不改变原有类结构的情况下,对类进行功能增强时,可以使用装饰者模式。
- 当需要动态地添加或删除类的功能时,可以使用装饰者模式。
- 当需要对一个类的功能进行多次扩展时,可以使用装饰者模式