大话设计模式-观察者模式

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

 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就可以得到通知。

当一个对象的改变需要同时改变其他对象,而且它还不知道具有还有多少对象需要改变时,需要考虑使用观察者模式。

观察者模式的所有工作就是接触耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使各自的变化都不会影响另一边的变化。

原文地址:https://www.cnblogs.com/zhangjxblog/p/8899903.html