zoukankan      html  css  js  c++  java
  • 观察者模式

      观察者模式

    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 }
  • 相关阅读:
    php大力力 [036节] 后台系统的登录页面界面做完啦
    php大力力 [035节] 先记录一些链接
    php大力力 [034节] 今天做出系统后台页面的界面啦
    php大力力 [033节] 随便看看:PHP程序员学习C++
    php大力力 [032节] php设计时候遇见麻烦:XQB50-H8268 进水电磁阀
    php大力力 [031节] php设计系统后台菜单和样式设计
    php大力力 [030节] php设计系统后台菜单
    php大力力 [029节] 做PHP项目如何下载js文件:使用腾讯浏览器把网上案例页面存储到本地
    php大力力 [027节] 被百度收录较好的几个视频网站示例
    SQL Server 创建触发器(trigger)---转载
  • 原文地址:https://www.cnblogs.com/SnailProgramer/p/4281676.html
Copyright © 2011-2022 走看看