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 }

 

 

posted @ 2014-05-20 23:49  CrazyCode.  阅读(349)  评论(0编辑  收藏  举报