zoukankan      html  css  js  c++  java
  • 装饰器模式(C++)

    介绍

    装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变结构. 属于结构型模式,作为现有类的一个包装.

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

    优点:

    • 装饰类和被装饰类是相互独立的,不会相互耦合;
    • 是继承的一个替代模式,装饰模式可以动态的扩展一个类的功能.

    缺点:

    • 多层装饰会变得越来越复杂.

    使用场景:

    • 扩展一个类的功能;
    • 动增加功能,动态撤销.

    UML

    image

    示例

    #include <iostream>
    
    //抽象组件角色:给出一个抽象接口,以规范准备接收附加责任的对象
    class Component{
    public:
        virtual ~Component(){}
        
        virtual void Configuration() = 0;
    };
    
    //具体组件类
    class Car: public Component {
    public:
        void Configuration() override {
            std::cout << "------Car-------" << std::endl;
        }
    };
    
    //装饰角色:持有一个组件对象的实例,并实现一个与抽象组件接口一致的接口
    class DecorateCar : public Component {
    public:
        DecorateCar(Component* car) : car_(car) {}
        void Configuration() override {
            car_->Configuration();
        }
    
    private:
        Component* car_;
    };
    
    
    //具体装饰角色:负责给组件对象添加额外的责任
    class DecorateLED: public DecorateCar {
    public:
        DecorateLED(Component* car) : DecorateCar(car){}
        
        void Configuration() override {
            DecorateCar::Configuration();
            AddLED();
        }
    
    private:
        void AddLED() {
            std::cout << "--------AddLED" << std::endl;
        }
    };
    
    //具体装饰角色:负责给组件对象添加额外的责任
    class DecoratePC : public DecorateCar {
    public:
        DecoratePC(Component* car) : DecorateCar(car) {}
        
        void Configuration() override {
            DecorateCar::Configuration();
            AddPC();
        }
    
    private:
        void AddPC() {
            std::cout << "-----------AddPC-----------" << std::endl;
        }
    };
    
    int main() {
        Car car;
        DecorateLED ledCar(&car);
        DecoratePC pcCar(&car);
        
        ledCar.Configuration();
        pcCar.Configuration();
        
        return 0;
    }
    

    本例改自: https://www.cnblogs.com/chengjundu/p/8473564.html

    适配器模式/装饰模式/代理模式的区别?

    • 适配器的特点在于兼容: 是将一个类(a)通过某种方式转换成另一个类(b);
    • 装饰器模式特点在于增强: 在一个原有类(a)的基础之上增加了某些新的功能变成另一个类(b);
    • 代理模式的特点在于隔离: 将一个类(a)转换成具体的操作类(b) .
  • 相关阅读:
    iframe跨域
    jquery 中的 $(“#”) 与 js中的document.getElementById(“”) 的区别
    jQuery中this与$(this)的区别
    div层调整zindex属性无效原因分析及解决方法
    The local variable......been initialized
    equals方法的重写
    eclipse快捷键
    JAVA中几个常用的方法
    Java基础4(方法基础和一维数组)
    Java基础3笔记
  • 原文地址:https://www.cnblogs.com/xl2432/p/13139335.html
Copyright © 2011-2022 走看看