面试十二、装饰器模式

装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

装饰器模式的主要优点有:

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
  • 装饰器模式完全遵守开闭原则

其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。

装饰器模式的结构与实现

通常情况下,**扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。**如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。

cpp 复制代码
#include <iostream>
// 通过装饰器增强类的功能

class  Car{
public:
    virtual void show()=0;
};

// 三个实体的汽车类
class Bmw:public Car{
public:
    void  show(){
        std::cout<< "这是一辆宝马汽车,配置有:基本配置 " <<std::endl;
    }
};

class Audi:public Car{
public:
    void  show(){
        std::cout<< "这是一辆奥迪汽车,配置有:基本配置 " <<std::endl;
    }
};

class Benz: public Car{
public:
    void  show(){
        std::cout<< "这是一辆奔驰汽车,配置有:基本配置 " <<std::endl;
    }
};

// 装饰器的基类
//class CarDecorator: public Car{
//public:
//    CarDecorator(Car *p):pCar(p){
//    }
//    virtual void show()=0;
//private:
//    Car *pCar;
//};

// 装饰器1
class ConcreteDecorator01 :public Car{
public:
    ConcreteDecorator01(Car *p):pCar(p){}
    void show(){
        pCar->show();
        std::cout<< "定速巡航" << std::endl;
    }
private:
    Car *pCar;
};

// 装饰器2
class ConcreteDecorator02 :public Car{
public:
    ConcreteDecorator02(Car *p):pCar(p){}
    void show(){
        pCar->show();
        std::cout<< "自动刹车" << std::endl;
    }
private:
    Car *pCar;
};

int main(){
    Car *p1 = new ConcreteDecorator01(new Bmw());
    p1 =new ConcreteDecorator02(p1);
    p1->show();
    Car *p2 = new ConcreteDecorator01(new Audi());
    p2->show();
    Car *p3 = new ConcreteDecorator01(new Benz());
    p3->show();
}
相关推荐
林川~013 小时前
Unity 反射(Reflection)从原理到实战:一篇讲透原理、用法、实战案例与性能优化
面试·性能优化·反射·il2cpp·type
晚安日记wanna3 小时前
React 为何不做双端 diff?Vue 与 React 更新逻辑的三层差异
前端·react.js·面试
keke.shengfengpolang4 小时前
2026年资金分析岗校招技术栈拆解:Excel预测模型、SQL取数、SAP与Oracle资金模块,附2027届备考路线
面试
顶点多余4 小时前
9.16 面试总结
linux·面试·职场和发展
Alice-YUE15 小时前
工业级 AI Agent 架构:5 层、2 范式、4 原则,一次讲透
面试·系统架构·大模型·ai agent·智能体
TrebleZ19 小时前
为什么总爱问Java中怎么判断两个对象是相同的
面试
怕浪猫1 天前
构建你自己的 AI Agent 发行版:从 Profile 定制到生产部署全流程
前端·后端·面试
yuanxi2001 天前
圣湘生物的三重转变:用PSS⁵价值力看懂从卖单品到卖经营价值
职场和发展·创业创新·学习方法
weixin_435208161 天前
【大模型面试宝典】开源啦!!!
人工智能·职场和发展·agent·deepseek
未秃头的程序猿1 天前
全链路追踪落地一年:从翻日志到秒级定位,我们都做了什么
java·后端·面试