zoukankan      html  css  js  c++  java
  • 装饰模式

    一、何为装饰模式

    1. 定义

    顾名思义,装饰模式就是为原有的对象添加不同的装饰,使得原有对象具备更加完善的功能。

    2. 应用场合

    在原有代码基础上进行重构或者添加一些新的职责时,为了尽可能的不修改原有代码或者提高原有类的复杂度,可以使用装饰者模式。装饰者模式可以提供以下功能:

    1)在不影响类的其他对象的前提下,动态的给指定对象添加职责;

    2)动态的为一个对象添加或者删除功能;

    3)为不能采用继承的方式进行系统功能扩充的场合提供解决方案。

    3. 结构图

    Component为待扩展功能的原型类;

    ConcreteComponent继承于原型类,提供原型类的具体实现,为本模式中的被装饰的类;

    Decorator是实现装饰功能的基类,内部包含一个被装饰的类ConcreteComponent的实例,可以通过构造函数或者接口进行赋值;

    ConcreteDecorator继承于Decorator,实现具体的装饰操作,每种子类都可以提供不同装饰功能

    4. 特点

    使用装饰模式可以:动态扩展类的原有功能;防止类的职责爆炸式增长。

    二、代码示例

    1. 场景

    为一个汽车的实现类进行装饰,完成汽车的改装工作。

    class Car
    
    {
    
    public:
    
    Car(QString name)
    
    : m_name(name)
    
    {};
    
    ~Car();
    
    
    virtual void func();
    
    private:
    
    QString m_name;
    
    };
    
     
    class MyCar : public Car
    
    {
    
    public:
    
    MyCar(QString name)
    
    : Car(name)
    
    {};
    
    ~MyCar();
    
     
    virtual void func()
    
    {
    
              //we can drive
    
    };
    };
    
     
    
    class DecoratorCar : public Car
    
    {
    
    public:
    
    DecoratorCar(Car *car)
    
    : Car("mycar")
    
    , m_car(car)
    
    {};
    
    ~DecoratorCar();
    
     
    
    protected:
    
    Car *m_car;
    
    };
    
     
    
    class FlyDecoratorCar : public DecoratorCar
    
    {
    
    public:
    
    FlyDecoratorCar(Car *car)
    
    : DecoratorCar(car)
    
    {};
    
    ~FlyDecoratorCar();
    
     
    
    virtual void func()
    
    {
    
    fly();
    
    m_car->func();
    
    }
    
    private:
    
    void fly()
    
    {
    
    //we can fly
    
    };
    
    };
    
    //此处可以继续添加装饰类,为Car提供更多的功能
    
    
    void main()
    
    {
    
    Car *mycar = new MyCar("mycar");
    
    FlyDecoratorCar *flyCar = new FlyDecoratorCar(mycar);
    
    
    flyCar->func();
    
    }

    以上为一个简单的例子,为已经创建出的原始对象mycar提供了飞行的功能。

    三、总结

    在使用装饰模式的时候,可以根据实际的使用场合,对本模式进行相应的修改,以更好的适配编码需求。

    如下有几种变化版的装饰者模式:

    1.只有一个具体装饰者,这样就不需要抽象装饰者,具体装饰者直接继承抽象构件就可以:

    2.同样,如果只有一个构件,则不需要进行构件的抽象,如下:

    3. 以此类推,如果构件与装饰者都只有一个时,我们可以直接只用装饰者继承构件,实现功能的扩展。

  • 相关阅读:
    练习5-3 数字金字塔 (15分)
    JSTL标签
    ssm+mysql+jsp打造在线考试系统WeKnow-学生端
    JSP常用内置对象
    mybatis入门2
    mybtis入门
    数据源的作用
    ssm动态查询向前台传json
    ssm中的注解
    ssm中的模糊查询
  • 原文地址:https://www.cnblogs.com/yuemw/p/10017545.html
Copyright © 2011-2022 走看看