观察者模式

  观察者模式

1.概述

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

2.优缺点

优点

  1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。    

  2)观察者的更替或数据模块的更新不会影响被观察者的存在。

  3)观察者和被观察者类可以方便的独立地被程序其他模块使用。

缺点
  1)如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  2)如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。
  3)如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
  4)虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。

3.适用情况

  在以下任一情况下都可以使用观察者模式:

  1)当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用;

  2)当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;

  3)当一个对象必须通知其它对象,而它又不能假定其它对象是谁;也就是说,你不希望这些对象是紧密耦合的。

4.代码

  《大话设计模式C++版》

 1 #include "stdafx.h"
 2 #include <string>
 3 #include <iostream>
 4 #include <vector>
 5 using namespace std;
 6 
 7 class Secretary;
 8 //看股票的同事类(观察对象,观察者)
 9 class StockObserver
10 {
11 private:
12   string name;
13   Secretary* sub;
14 public:
15   StockObserver(string strname,Secretary* strsub)
16   {
17     name=strname;
18     sub=strsub;
19   }
20   void Update();
21 };
22 //秘书类(主题对象,通知者)
23 class Secretary
24 {
25 private:
26   vector<StockObserver> observers;
27 public:
28   string action;
29   void Add(StockObserver ob)
30   {
31     observers.push_back(ob);
32   }
33   void Notify()
34   {
35     vector<StockObserver>::iterator p = observers.begin();
36     while (p!=observers.end())
37     {
38       (*p).Update();
39       p++;
40     }
41   }
42 };
43 
44 void StockObserver::Update()
45 {
46   cout<<name<<":"<<sub->action<<",不要玩股票了,要开始工作了"<<endl;
47 }
48 
49 //客户端
50 int main()
51 {
52   Secretary *p=new Secretary();  //创建通知者
53 
54   //观察者
55   StockObserver *s1= new StockObserver("小李",p);
56   StockObserver *s2 = new StockObserver("小赵",p);
57   //加入通知队列
58   p->Add(*s1);
59   p->Add(*s2);
60   //事件
61   p->action="老板来了";
62   //通知
63   p->Notify();
64 
65   system("pause");
66   return 0;
67 }
原文地址:https://www.cnblogs.com/SnailProgramer/p/4281676.html