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辨析

    继承时静态增加功能

    装饰是动态增加功能

  • 相关阅读:
    使用非root用户在RedHat 4下安装XHProf
    使用ClippingNode对精灵进行遮罩处理
    令Code::Blocks支持C++11特性
    解决cocos2dx在VS2012中文版环境下不支持中文的问题
    bzoj 1045[HAOI2008] 糖果传递
    bzoj 1070[SCOI2007]修车
    bzoj [ZJOI2010]网络扩容
    bzoj 1089[SCOI2003]严格n元树
    bzoj 4566[Haoi2016]找相同字符
    bzoj 1085[SCOI2005]骑士精神
  • 原文地址:https://www.cnblogs.com/lang5230/p/5328304.html
Copyright © 2011-2022 走看看