装饰器模式 Decorator

简介:
是一种结构型模型,创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能
也不想/不能继承已有功能,在子类扩展,那么装饰器应运而生。

应用场景:
举个例子,目前我所在的公司是为各大车厂做一些辅助驾驶功能的,基本是在L2级别的功能,比如HWP ACC AEB .
假设现在一些车厂找我们公司合作,希望将我们的某些辅助功能加到他们的车上:

0.汽车基类:

#include <iostream>
#include <memory>

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

1.奇瑞汽车,已有HWP和ACC功能

class CherryCar:public Car{
    void ShowFunctions(){
        std::cout<<"now ,CherryCar functions is HWP ACC";
    }
};

2.宝马汽车,已有HWP和AEB功能

class BMWCar:public Car{
    void ShowFunctions(){
        std::cout<<"now ,BMWCar functions is HWP AEB";
    }
};

3.奥迪汽车,已有ACC和AEB功能

class AudiCar:public Car{
    void ShowFunctions(){
         std::cout<<"now ,AudiCar functions is ACC AEB";
    }
};

此时,他们公司找到我们公司,希望能扩展他们的功能,展开一系列合作,再不改变他们公司代码的前提下,将我们功能添加上去,所以,我们公司实现了每个功能的装饰器类,来为他们添加新功能:

1.HWP功能装饰器类:

class HWPDecorator:public Car{
public:
    HWPDecorator(Car *p):pcar_(p){}
    void ShowFunctions(){
        pcar_->ShowFunctions();
        std::cout<<" HWP"<<std::endl;
    }
private:
    Car *pcar_;
};

2.ACC功能装饰器类:

class ACCDecorator:public Car{
public:
    ACCDecorator(Car *p):pcar_(p){}
    void ShowFunctions(){
        pcar_->ShowFunctions();
        std::cout<<" ACC"<<std::endl;
    }
private:
    Car *pcar_;
};

3.AEB功能装饰器类:

class AEBDecorator:public Car{
public:
    AEBDecorator(Car *p):pcar_(p){}
    void ShowFunctions(){
        pcar_->ShowFunctions();
        std::cout<<" AEB"<<std::endl;
    }
private:
    Car *pcar_;
};

使用:

int main(){
    std::shared_ptr<Car> cherry = std::make_shared<AEBDecorator>(new CherryCar()); 
    //AEBDecorator包装了原来的奇瑞汽车类,没有改变原来奇瑞汽车功能的code,下面同理
    cherry->ShowFunctions();

    std::shared_ptr<Car> bmw = std::make_shared<ACCDecorator>(new BMWCar());
    bmw->ShowFunctions();  

    std::shared_ptr<Car> audi = std::make_shared<HWPDecorator>(new AudiCar());
    audi->ShowFunctions();  
    return 0;
}

输出:

now ,CherryCar functions is HWP ACC AEB
now ,BMWCar functions is HWP AEB ACC
now ,AudiCar functions is ACC AEB HWP

当然,实际开发情景不会像现在一样简单明了,往往很复杂,这里就是为了把这个问题讲清楚,才想的这个例子,
假设这时其他的车厂找我们公司合作,他们也想要这些功能,我们是不是也可以用装饰的方式,添加到他们已有的项目功能中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值