设计模式--观察者模式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常见距离

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

猫和老鼠

posted @ 2016-03-28 17:30  狼行博客园  阅读(1099)  评论(0编辑  收藏  举报