95、装饰器模式

装饰器模式(Decorator Pattern)允许向⼀个现有的对象添加新的功能,同时⼜不改变其结构。

这种类型的设计模式属于结构型模式,它是作为现有的类的⼀个包装。

代码没有改变 Car 类的内部结构,还为其增加了新的功能,这就是装饰器模式的作⽤。

#include <iostream>
#include <list>
#include <memory>
using namespace std;
 
//抽象构件类 Transform (变形⾦刚)
class Transform{
public:
    virtual void move() = 0;
}; 
 
//具体构件类Car
class Car : public Transform{
public:
    Car(){
        std::cout << "变形⾦刚是⼀辆⻋!" << endl;
    }
    void move(){
        std::cout << "在陆地上移动。" << endl;
    }
}; 
 
//抽象装饰类
class Changer : public Transform{
public:
    Changer(shared_ptr<Transform> transform){
        this->transform = transform;
    }
    void move(){
        transform->move();
    }
private:
    shared_ptr<Transform> transform; 
}; 
 
//具体装饰类Robot
class Robot : public Changer{
public:
    Robot(shared_ptr<Transform> transform) : Changer(transform){
        std::cout << "变成机器⼈!" << std::endl;
    }
 
    void say(){
        std::cout << "说话!" << std::endl;
    }
}; 
 
//具体装饰类AirPlane
class Airplane : public Changer{
public:
    Airplane(shared_ptr<Transform> transform) : Changer(transform){
        std::cout << "变成⻜机!" << std::endl;
    }
 
    void say(){
        std::cout << "在天空⻜翔!" << std::endl;
    }    
}; 
 
int main(void){
    shared_ptr<Transform> camaro = make_shared<Car>();
    camaro->move();
    std::cout << "--------------" << endl;
    shared_ptr<Robot> bumblebee = make_shared<Robot>(camaro);
    bumblebee->move();
    bumblebee->say();
    return 0;
} 
/*
输出
变形⾦刚是⼀辆⻋!
在陆地上移动。
--------------
变成机器⼈!
在陆地上移动。
说话!
--------------
变成⻜机!
在陆地上移动。
在天空⻜翔!
*/

Last updated