设计模式--装饰(Decorator)模式
概念
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许动态地给一个对象添加一些额外的职责,而不需要改变其结构。装饰器模式提供了一种灵活的方式来扩展对象的功能,同时保持对象的接口一致。
示例
在C++中,装饰器模式通常通过继承和接口实现。下面是一个简单的示例来说明C++中的装饰器模式:
首先,定义一个接口(抽象组件),它定义了对象应该具备的基本功能:
class Component {
public:
virtual void Operation() = 0; // 纯虚函数,定义基本功能
};
然后,创建一个具体的组件类,它实现了接口并提供了实际的功能:
class ConcreteComponent : public Component {
public:
void Operation() override{
std::cout << "具体的操作对象" << std::endl;
}
};
接下来,创建一个装饰器类,它继承自组件接口,并持有一个指向组件对象的指针。装饰器类通过在其操作方法中调用组件对象的方法,并在调用前后添加额外的功能,从而实现对组件的装饰:
class Decorator : public Component{
public:
Component* component;
public:
void SetComponent(Component* component) {
this->component = component;
}
void Operation() override{
if (nullptr != this->component) {
this->component->Operation();
}
}
};
最后,可以创建具体的装饰器类,它们继承自装饰器类,并根据需要添加特定的额外功能:
class ConcreteDecoratorA : public Decorator {
public:
std::string addState;
public:
void Operation() override {
Decorator::Operation();
addState = "New State";
std::cout << "具体装饰对象A的操作" << std::endl;
}
};
class ConcreteDecoratorB : public Decorator {
public:
void Operation() override {
Decorator::Operation();
AddedBehavior();
std::cout << "具体装饰对象B的操作" << std::endl;
}
private:
void AddedBehavior() {}
};
使用装饰器模式时,可以根据需要动态地创建装饰器对象,并将它们应用于组件对象上。例如:
int main() {
Component* component = new ConcreteComponent(); // 创建组件对象
Decorator* decoratorA = new ConcreteDecoratorA(component); // 创建装饰器A对象,并将其应用于组件对象
Decorator* decoratorB = new ConcreteDecoratorB(decoratorA); // 创建装饰器B对象,并将其应用于装饰器A对象
decoratorB->Operation(); // 执行操作,将依次调用装饰器B、装饰器A和组件对象的方法
delete decoratorB;
delete decoratorA;
delete component;
return 0;
}
int main() {
ConcreteComponent* c = new ConcreteComponent(); // 创建组件对象
ConcreteDecoratorA* d1 = new ConcreteDecoratorA(); // 创建装饰器A对象
ConcreteDecoratorB* d2 = new ConcreteDecoratorB(); // 创建装饰器B对象
d1->SetComponent(c); // 装饰器A对象应用于组件对象
d2->SetComponent(d1); // 装饰器B对象应用于装饰器A对象
d2->Operation(); // 执行操作,将依次调用组件对象的方法、装饰器A、装饰器B
return 0;
}
输出结果:
具体的操作对象
具体装饰对象A的操作
具体装饰对象B的操作
通过装饰器模式,可以灵活地组合多个装饰器对象,以实现不同的功能扩展。每个装饰器对象都可以独立地添加额外的功能,而不影响其他装饰器或组件对象的功能。这使得装饰器模式成为一种非常强大且灵活的设计模式。
Do not communicate by sharing memory; instead, share memory by communicating.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了