观察者模式

定义:

  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个通知者对象。这个通知者对象在状态发生变化时,会通知所有观察者对象,使他们能够自己更新自己。

结构图:

观察者模式

 

 

 

 

 

 代码:

//通知者接口类

Class Subject

{

private:

  //观察者集合

  IList<Observer> lObservers = new List<Observer>();

Public:

  //增加观察者的方法

  void Attach(Observer pObserver)

  {

    lObservers.Add(pObserver);

  }

  //删除观察者的方法

  void Detach(Observer pObserver)

  {

    lObservers.Remove(pObserver);

  }

  //通知

  void Notify()

  {

    foreach (Observer o in lObservers)

    {

      //循环调用每个观察者的更新方法

      o.Update();

    }

  }

}

//Observers抽象观察者类

Class Observers

{

public:

  //定义更新接口

  void Update() = 0;

}

//具体观察者类

Class ObserversA : Observers

{

  void Update()

  {

    。。。;

  }

}

//客户端

Subject cSubject = new Subject();

cSubject.Attach(new ObserversA());//多个观察者在这里添加

Attach.Notify();

 

进阶版:委托方式(使用函数引用)

//通知者类

Class Subject

{

Public:

  //声明一个委托Update

  event EventHandler Update;

  //通知

  void Notify()

  {

    Update();

  }

}

//具体观察者类A

Class ObserversA

{

  void UpdateA()

  {

    。。。;

  }

}

//具体观察者类B

Class ObserversB

{

  void UpdateB()

  {

    。。。;

  }

}

//客户端

Subject cSubject = new Subject();

ObserversA* pObserversA = new ObserversA();

ObserversB* pObserversB = new ObserversB();

cSubject.Update += new EventHandler(pObserversA.UpdateA);//这里使用函数引用

cSubject.Update += new EventHandler(pObserversB.UpdateB);

Attach.Notify();

 

使用时机:

  当依赖关系为一对多时;

 

优点:解耦合,依赖双方都只依赖抽象接口,甚至通知者都不需要知道具体观察者。建立了一套触发机制。

缺点:如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

上一篇:mysql 45讲 相关锁的概念


下一篇:python3之input和print