23种设计模式C++源码与UML实现--装饰者模式

装饰者模式

github代码仓库

装饰者模式(Decorator)又叫包装模式,通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替代方案。

装饰模式就是把要添加的功能分别放到单独的类中,并让这个类中包含它要装饰的对象,当需要执行的时候,客户端可以有选择地、按顺序执的使用装饰功能包装的对象。

在这里插入图片描述

实用性

动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责

处理那些可以撤销的职责

当不能采用子类的方法进行扩充时,一种情况是,可能有大量的独立扩展,为支持每一种组合将产生大量的子类,使得子类数目爆炸性增长,另外一种可能是类的定义被隐藏,或类的定义不能用于生成子类。

装饰者模式代码实现:

//
// Created by andrew on 2020/11/17.
//
#include <iostream>

using namespace std;

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

    virtual ~Car() {

    }
};

class RunCar : public Car {
public:
    virtual void show() {
        cout << "run car" << endl;
    }

    ~RunCar() {

    }
};

// 当传进来的是runcar的时候,就能实现在不继承runcar的情况下扩展runcar的功能
class SwimCarDirector : public Car {
public:
    SwimCarDirector(Car *car) {
        m_car = car;
    }

    ~SwimCarDirector() {

    }

    void swim() {
        cout << "swim" << endl;
    }

    virtual void show() {
        m_car->show();
        swim();
    }

private:
    Car *m_car;
};

// 当传进来的是runcar的时候,就能实现在不继承runcar的情况下扩展runcar的功能
class FlyCarDirector : public Car {
public:
    FlyCarDirector(Car *car) {
        m_car = car;
    }

    ~FlyCarDirector() {

    }

    void fly() {
        cout << "fly" << endl;
    }

    virtual void show() {
        m_car->show();
        fly();
    }

private:
    Car *m_car;
};


int main(int argc, char *argv[]) {
//   考点,虚基类虽然不能定义对象,但是能定义指针,指针指向子类
    Car *mycar = NULL;
    mycar = new RunCar;
    mycar->show();
    cout << "-------------------------" << endl;
//    修饰模式,将run car修饰之后就能飞了
    FlyCarDirector *flyCar = new FlyCarDirector(mycar);
    flyCar->show();
//
    cout << "-------------------------" << endl;
    SwimCarDirector *swimCar = new SwimCarDirector(mycar);
    swimCar->show();

    delete swimCar;
    delete flyCar;
    delete mycar;

    cout << "decorator demo" << endl;
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Achilles.Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值