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

    继承时静态增加功能

    装饰是动态增加功能

  • 相关阅读:
    10年测试专家深度解读接口测试
    测试技术大牛谈成长经历:一个好的软件测试工程师应该做到这些!
    一位测试老鸟的工作经验分享
    又一名程序员倒下,网友:我们只是新时代农民工
    软件测试工程师这样面试,拿到offer的几率是80%
    App测试流程及测试点(个人整理版)
    自动化测试是什么?
    软件测试工程师的职业技能分析
    月薪15k的测试员需要学习什么技术?
    面向对象
  • 原文地址:https://www.cnblogs.com/lang5230/p/5328304.html
Copyright © 2011-2022 走看看