zoukankan      html  css  js  c++  java
  • 设计模式--装饰模式C++实现

    装饰模式C++实现

    1定义

    动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活、可作为继承的替代

    2类图

    3实现

    //构件

    class Component

    {

    protected:

      Component();

    public:

       virtual void operate() = 0;

      virtual ~Component() = 0;

    };

    class ConcreteComponent: public Component

    {

    public:

      ConcreteComponent();

      ~ConcreteComponent();

      void operate()

      {

        cout << " do Something..."<<endl;

      }

    };

    //注,这里的继承很关键,因为客户端只是知道Component,而不知Decorator,这样做提供了多态表示的机会

    class Decorator:public Component

    {

    private:

      Component *_com;

    public:

      Decorator(Component* com)

        :_com(com)

      {} 

      void operate()

      {

         _com->operate();

      }

    };

    class ConcreteDecorator:public Decorator

    {

    public:

      ConcreteDecorator(Component *com) 

        :Decorator(com)

      {}

    private:

      void method1()

      {

        cout << "装饰1"<<endl;

      }

      void operate()

      {

        method1();

        Decorator::operate();

      }

    };

    void Test

    {

      component *com = new ConcreteComponent();

      com = new ConcreteDecorator(com);

      com.operate();

    };

    4应用

    ①优点

    装饰类和被装饰类可以独立发展,不会有耦合关系。Decorator是从外部扩展功能,而不知道具体的构建

    装饰模式是继承关系的一个替代方案。实现的是is-a关系(注解继承)

    可以动态的扩展一个类的功能

    ②缺点

    多层装饰会有无限剥离的问题,影响效率,性能,工作量大

    5使用场景

    需要扩展一个类的功能,附加功能

    需要动态给一个对象增加功能,且可以再动态撤销

    需要为一批兄弟类进行改装或加装功能,首选装饰功能

    6辨析

    继承时静态增加功能

    装饰是动态增加功能

  • 相关阅读:
    题库重整
    计算几何练习题――直线交点
    An Easy Task
    简单排序
    IBM Minus One
    Binary Numbers
    去掉VS2010代码中文注释的红色下划线
    【转】Windows socket基础
    【STL】vector的insert方法详解
    window7下 cocos2dx android交叉编译环境部署小结
  • 原文地址:https://www.cnblogs.com/lang5230/p/5328304.html
Copyright © 2011-2022 走看看