• 结构型模式 装饰模式


    结构型模式 装饰模式

    适用于:  装饰者模式(Decorator Pattern)动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。

    /**
     * 结构型模式 装饰模式
     * 装饰( Decorator )模式又叫做包装模式。
     * 通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。  
     * 装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。
     *
     */
    
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <iostream>
    #include <string>
    
    class Car
    {
    public:
        virtual void show() = 0;
        virtual ~Car() {};
    };
    
    class RunCar: public Car
    {
    public:
        void Run()
        {
            std::cout << "可以跑" << std::endl;
        }
        virtual void show() override
        {
            Run();
        }
    };
    
    class SwimCarDirector: public Car
    {
    public:
        SwimCarDirector(Car *car)
        {
            m_car = car;
        }
        void swim()
        {
            std::cout << "可以游" << std::endl;
        }
        virtual void show() override
        {
            m_car->show();
            swim();
        }
    private:
        Car *m_car;
    };
    
    class FlyCarDirector:public Car
    {
    public:
        FlyCarDirector(Car *car)
        {
            m_car = car;
        }
        void Fly()
        {
            std::cout << "可以飞" << std::endl;
        }
        virtual void show() override
        {
            m_car->show();
            Fly();
        }
    private:
        Car *m_car;
    };
    
    void mytest()
    {
        Car *runcar = nullptr;
        runcar = new RunCar();
        runcar->show();
    
        std::cout << "车开始装饰 swim" << std::endl;
        SwimCarDirector *swimcar = new SwimCarDirector(runcar);
        swimcar->show();
    
        std::cout << "车开始装饰 fly" << std::endl;
        FlyCarDirector *flycar = new FlyCarDirector(runcar);
        flycar->show();
    
        delete flycar;
        flycar = nullptr;
        delete swimcar;
        swimcar = nullptr;
        delete runcar;
        runcar = nullptr;
    
        return;
    }
    
    
    int main()
    {
        mytest();
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    MySQL之索引
    MySQL之用户权限及pymysql
    Vue初识
    input标签的accept属性、JQuery绑定keyDown事件
    给bootstrap-sweetalert弹框的按钮绑定事件
    JavaScript FormData对象,FileReader对象,files属性
    Django CBV加装饰器、Django中间件、auth模块
    Django session和cookie
    Django form组件
    Django ajax的简单使用、自定义分页器
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7777734.html
Copyright © 2020-2023  润新知