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 }