zoukankan      html  css  js  c++  java
  • head first 设计模式 观察者模式

    Head first 设计模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。   让主题与观察者之间松耦合

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

    设计模式:描述了如何建立这种关系。这一模式中的关键对象是  目标(subject)和观察者(observer)。一个目标可以有任意数目的依赖他的观察者。一旦目标的状态发生改变,所有的观察者都会收到通知。作为对这个通知的相应,每个观察者都将查询目标以使其状态与目标的状态同步。也成为  发布 - 订阅 。

    设计原则:为了交互对象之间的松耦合设计而努力

    松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的相互依赖降到了最低。

      1 #include "stdafx.h"
      2 #include<iostream>
      3 #include<list>
      4 using namespace std;
      5 /*观察者模式*/
      6 class Subject;
      7 class Obverser
      8 {
      9 public:
     10     Subject* sub;
     11     Obverser(Subject* sb):sub(sb){}
     12     virtual void update(Subject* sb)=0;
     13 };
     14 class Subject
     15 {    
     16 private:
     17     int result;
     18 public:
     19     list<Obverser*> obverselist;
     20     virtual void registerObserver(Obverser* ob)=0;
     21     virtual void removeObserver(Obverser* ob)=0;
     22     virtual void notifyObservers()=0;
     23     virtual void setResult(int i)
     24     {
     25         result =i;
     26         notifyObservers();
     27     }
     28     virtual int retResult(){return result;}
     29 };
     30 
     31 class ConcreteSubject:public Subject
     32 {
     33 public:
     34     virtual void registerObserver(Obverser* ob)
     35     {
     36         obverselist.push_back(ob);
     37     }
     38     virtual void removeObserver(Obverser* ob)
     39     {
     40         list<Obverser*>::iterator it= obverselist.begin();
     41         while(it!=obverselist.end())
     42         {
     43             if(*it == ob)
     44             {
     45                 it=obverselist.erase(it);
     46             }else{
     47                 it++;
     48             }
     49         }
     50     }
     51     virtual void notifyObservers()
     52     {
     53         for(list<Obverser*>::iterator it=obverselist.begin();it!=obverselist.end();++it)
     54         {
     55             (*it)->update(this);
     56         }
     57     }
     58 };
     59 
     60 class concreteObverser1:public Obverser
     61 {
     62 public:
     63     concreteObverser1(Subject* sb):Obverser(sb)
     64     {
     65         sub->registerObserver(this);
     66     }
     67     virtual void update(Subject *sb)
     68     {
     69         cout<<"我是观察者1号,我收到通知了"<<sb->retResult()<<endl;;
     70     }
     71 };
     72 
     73 class concreteObverser2:public Obverser
     74 {
     75 public:
     76     concreteObverser2(Subject* sb):Obverser(sb)
     77     {
     78         sub->registerObserver(this);
     79     }
     80     virtual void update(Subject *sb)
     81     {
     82         cout<<"我是观察者2号,我收到通知了"<<sb->retResult()<<endl;
     83     }
     84 };
     85 
     86 class concreteObverser3:public Obverser
     87 {
     88 public:
     89     concreteObverser3(Subject* sb):Obverser(sb)
     90     {
     91         sub->registerObserver(this);
     92     }
     93     virtual void update(Subject *sb)
     94     {
     95         cout<<"我是观察者3号,我收到通知了"<<sb->retResult()<<endl;
     96     }
     97 };
     98 int _tmain(int argc, _TCHAR* argv[])
     99 {
    100     Subject *cs=new ConcreteSubject;
    101     Obverser *cob1 = new concreteObverser1(cs);
    102     Obverser *cob2 = new concreteObverser2(cs);
    103     cs->setResult(1);
    104     cs->setResult(10);
    105     Obverser *cob3 = new concreteObverser3(cs);
    106     cs->setResult(6);
    107     cs->removeObserver(cob2);
    108     cs->setResult(7);
    109     cs->removeObserver(cob1);
    110     cs->setResult(8);
    111     return 0;
    112 }
  • 相关阅读:
    【转】从源码分析Handler的postDelayed为什么可以延时?
    android系统中如何通过程序打开某个AccessibilityService
    【转】在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()
    【转】Android 增,删,改,查 通讯录中的联系人
    【转】Android调用Sqlite数据库时自动生成db-journal文件的原因
    【转】Android辅助功能AccessibilityService自动全选择文字粘贴模拟输入
    【转】Android中保持Service的存活
    Multi-label && Multi-label classification
    第2章 排序 || 第17节 三色排序练习题
    第2章 排序 || 第15节 有序数组合并练习题
  • 原文地址:https://www.cnblogs.com/crazycodehzp/p/3740366.html
Copyright © 2011-2022 走看看