设计模式(一):观察者模式
观察者模式
观察者模式是一种一对多的行为型设计模式,面向的需求是观察者A对B的变化高度敏感,B发生变化时需要及时做出处理。涉及的角色有:
抽象通知者/抽象被观察者(Subject):将任意数量的观察者保存在一个容器中,提供一个接口增删观察者;
具体通知者/具体被观察者(Concrete Subject):在内部情况发生变化后,向注册过的所有观察者发生通知;
抽象观察者(Observer):定义更新接口,在通知者变化时能够通知自己;
具体观察者(Concrete Observer):具体实现更新接口,在通知者状态变化时做出处理行为;
特点
通知者/被观察者只有一个,观察者可有多个,观察者关心通知者的变化;
信息传递是单向的,通知者发送消息,观察者接受信息;
信息通过类似回调函数的机制进行传输,通知者状态变化调用更新函数,无需观察者定期轮询;
缺点:
通知者逐个调用观察者函数接口,当对象很多时通知效率和实时性变低;
当观察者和观测目标存在循环依赖,系统无法正常使用;
观察者模式没有机制表明观察对象具体的变化,只是知道对象发生变化。
模式实例
通知者状态变化:通知"老板来了",两个观察者做出相应的变化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using namespace std;
class NotifierBase; //抽象通知者
class ObserverBase{ //抽象观察者
protected:
string name;
NotifierBase* nof;
public:
ObserverBase(string name,NotifierBase* nof):name(name),nof(nof){} //关联通知者
virtual void Update() = 0; //抽象观察者定义更新接口
};
class NBAObserver:public ObserverBase{ //具体观察者1
public:
NBAObserver(string name,NotifierBase* nof):ObserverBase(name,nof){}
virtual void Update(); //类外实现:具体观察者实现更新接口
};
class StockObserver:public ObserverBase{ //具体观察者2
public:
StockObserver(string name,NotifierBase* nof):ObserverBase(name,nof){}
virtual void Update(); //类外实现:具体观察者实现更新接口
};
class NotifierBase{ //抽象通知者
public:
string action; //通知者行为变化
vector<ObserverBase*>vp;
void Join(ObserverBase* ob){ //注册观察者
vp.push_back(ob);
}
virtual void Notify() = 0; //定义通知接口
};
class SpyNotifier:public NotifierBase{ //具体通知者
public:
void Notify(){ //逐个通知观察者
for(auto i:vp){
i->Update();
}
}
};
void NBAObserver::Update(){ //观察者具体处理行为
cout<<nof->action<<"不要看NBA"<<endl;
}
void StockObserver::Update(){ //观察者具体处理行为
cout<<nof->action<<"不要看股票"<<endl;
}
int main(){
NotifierBase *spy = new SpyNotifier(); //通知者
ObserverBase *nba_person = new NBAObserver("Eden",spy); //观察者
ObserverBase *stock_person = new StockObserver("Mike",spy);
spy->Join(nba_person); //观察者注册
spy->Join(stock_person);
spy->action = "老板来了";
spy->Notify(); //通知者通知观察者
return 0;
}
参考链接: C++设计模式——观察者模式