zoukankan      html  css  js  c++  java
  • 设计模式--观察者模式C++实现

    观察者模式C++实现

    1定义

    Observer/Publish/subscribe发布订阅模式

    定义对象间一种一对多的依赖关系,使得当一个对象改变状态时,所有依赖他的对象都能获得通知并被自动更新

    2类图

    角色分析

    Subject被观察者,定义被观察者必须实现的职责,必须能动态增加,取消观察者。管理观察者并通知观察者

    Observer观察者,接收消息后,即进行Update 。对接收到的信息进行处理

    ConcreteSubject具体被观察者,定义自己业务,同时定义对那些时间进行通知

    ConcreteObserver具体观察者,每个观察者都应当有自己具体的处理逻辑

    3实现

    class Subject

    {

    protected:

      Subject();

    public:

      virtual ~Subject()=0;

      void add(Observer x)

      {_obv.push_back(x);}

      void del(Observer x)

      {_obv.remove(x);}

      //通知所有观察者

      void notifyObservers()

      {

        for(int i = 0; i< _obv.size();++i)

        {

          _obv[i].update();  

        }

      }

    private:

      vector<Observer> _obv;//保存所有观察本对象的观察者

    };

    class ConcreteSubject:public Subject

    {

    public:

      void doSomething()

      {

        //doSomething;

        notifyObservers();

      }

    };

    class Observer

    {

    protected:

      Observer();

    public:

      virtual ~Objserver()=0;

      virtual void update()=0;

    };

    class ConcreteObserver:public Observer

    {

    public:

      ConcreteObserver();

      ~ConcreteObserver();

      void update()

      {

        cout << "接受小心,并进行处理"<<endl;

      }

    };

    class Client
    {

    public:

      void operator()()

      {

        Subject* sub = new ConcreteSubject();

        Observer *obs = new ConcreteObserver();

        sub->add(obs);

        sub->doSomething();  

      }

    };

    4应用

    优点

    观察者和被观察者之间的抽象耦合

    建立一套触发机制,链式运动,类似责任链

    缺点

    多级触发影响效率,且会有一层中断而影响整体的问题存在。应当异步处理

    5使用场景

    关联行为场景

    时间多级触发

    跨系统的消息交换场景,eg消息队列的处理机制

    6注意事项

    也就是缺点了:

    广播链问题,  所以->最多出现一个对象既是观察者又是被观察者/最多传递两次

    异步处理问题,因为可能多个观察者同时观察一个对象,∴ 异步,∵异步,∴线程安全和队列问题。参考Message Queue

    7扩展

    ①将被观察者对于观察者的注册工作替换为  观察者检查被观察者状态的变更。做到单一职责,观察者将被观察者作为参数

    ②真实项目中的观察者和被观察者

    a存在消息沟通

    b观察者响应方式:多线程技术(异步架构)/缓存技术(同步架构)

    c被观察者尽量自己做主,对于被观察者行为,自己进行确定该是否需要上报观察者

    8常见距离

    文件系统,文件变更-报告容量。

    猫和老鼠

  • 相关阅读:
    HDU 3389 Game (阶梯博弈)
    国内操作系统OS分析(上)
    激光雷达应用技术分析
    构建深度学习框架运行平台
    GitHub上YOLOv5开源代码的训练数据定义
    GitHub上开源的YOLOv5
    深度学习调用TensorFlow、PyTorch等框架
    CUDA C 纹理提取Texture Fetching
    CPU,GPU,GPGPU
    毫米波RADAR与LIDAR探秘
  • 原文地址:https://www.cnblogs.com/lang5230/p/5329874.html
Copyright © 2011-2022 走看看