简介
+ 动态的给对象添加一些额外的职责,就增加功能来说,要比生成子类更加灵活
使用场景
+ 在不影响其他对象的情况下,以透明、动态的方式给单个对象添加职责;
+ 处理可以撤销的职责
+ 在不能采用生成子类的方法进行扩充时。
- 可能有大量独立的扩展,为支持的每一种组合将产生大量的子类,使得子类数量很多
- 类定义被隐藏,或者类兴义不能用于生成子类
角色
+ component
- 抽象类,是具体对象和装饰类的父类
+ ConcreteComponent
- 具体的对象类
+ Decorator
- 维持一个指向 component 抽象类的指针,并继承对应的虚函数
+ ConcreteDecorator
- 重新虚函数对应的罗
UML 类图
时序图
优缺点
+ 比静态继承更灵活
+ 避免在层次结构高层的类有太多的特征
+ Decorator 和它的 Component 不一样
+ 有许多小对象
代码实现
- 给定两种初始的汽车类,分别使用装饰模式给它们添加新的功能。
#include<iostream>
#include<string>
using namespace std;
// abstract component class
class Car
{
public:
virtual void showInfo() = 0;
};
class TOYOTO : public Car
{
public:
TOYOTO(){}
TOYOTO(string name) {
m_name = name;
}
void showInfo(){
cout << m_name << endl;
}
private:
string m_name;
};
class VOLOVL : public Car
{
public:
VOLOVL(){}
VOLOVL(string name) {
m_name = name;
}
void showInfo(){
cout << m_name << endl;
}
private:
string m_name;
};
class Function : public Car
{
protected:
Car* m_pCar;
public:
void Decorate(Car* pCar){
m_pCar = pCar;
}
void showInfo(){
if(m_pCar != NULL){
m_pCar->showInfo();
}
}
};
class Navigator : public Function
{
public:
void showInfo(){
cout << "Navigator: ";
Function::showInfo();
}
};
class AutoDrive : public Function
{
public:
void showInfo(){
cout << "AutoDrive: ";
Function::showInfo();
}
};
class SpeechControl : public Function
{
public:
void showInfo(){
cout << "SpeechControl: ";
Function::showInfo();
}
};
int main()
{
Car* p_CToyota = new TOYOTO("toyoto");
Navigator* p_CNavi = new Navigator();
AutoDrive* p_CAuto = new AutoDrive();
p_CNavi->Decorate(p_CToyota);
p_CAuto->Decorate(p_CNavi);
p_CAuto->showInfo();
Car* p_CVolo = new VOLOVL("Volovo");
Navigator* p_CNa2 = new Navigator();
SpeechControl* p_CSpeech = new SpeechControl();
p_CNa2->Decorate(p_CVolo);
p_CSpeech->Decorate(p_CNa2);
p_CSpeech->showInfo();
return 0;
}
总结
+ 在客户端中要最后一个添加的职责,用来包装好的车对象,因此需要最后一个装饰的实例显示结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2021-03-29 webserver服务器
2021-03-29 轮子哥的网站地址
2018-03-29 1085. Perfect Sequence (25)
2018-03-29 1038. Recover the Smallest Number (30)