观察者模式:定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够各自更新自己。
1 // Observer.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <list> 7 #include <string> 8 using namespace std; 9 10 class Observer{ 11 public: 12 virtual void Update()=0; 13 }; 14 class Subject{ 15 public: 16 virtual void addObserver(Observer *obs)=0; 17 virtual void deleteObserver(Observer *obs)=0; 18 virtual void Update()=0; 19 }; 20 21 class ConcreteSubject:public Subject{ 22 private: 23 list<Observer*> listobs; 24 public: 25 void addObserver(Observer *obs){ 26 listobs.push_back(obs); 27 } 28 void deleteObserver(Observer *obs){ 29 listobs.remove(obs); 30 } 31 void Update(){ 32 list<Observer*>::iterator it; 33 for(it=listobs.begin();it!=listobs.end();it++){ 34 (*it)->Update(); 35 } 36 } 37 }; 38 39 class ConcreteObserver:public Observer{ 40 41 private: 42 string name; 43 public: 44 ConcreteObserver(string name){ 45 this->name = name; 46 } 47 void Update(){ 48 std::cout << this->name << "update()!!!"<<endl; 49 } 50 }; 51 int _tmain(int argc, _TCHAR* argv[]) 52 { 53 54 Subject * su1 = new ConcreteSubject(); 55 Observer * obs = new ConcreteObserver("su1"); 56 su1->addObserver(obs); 57 su1->Update(); 58 59 return 0; 60 }
观察者模式的关键对象时主题subject和观察者observe,一个subject可以有任意数目的依赖它的Observe,一旦subject的状态发生变化,所有的observer就可以得到通知。
当一个对象的改变需要同时改变其他对象,而且它还不知道具有还有多少对象需要改变时,需要考虑使用观察者模式。
观察者模式的所有工作就是接触耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使各自的变化都不会影响另一边的变化。