观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
典型使用情况:某个对象掌握数据,当数据更新时通知多个对象更新显示(参考MVC)。
在java内置的Observer模式中支持“push”和“pull”两种方式,一般好像push更多一点,下面就以push为例:
UML图:
依然上一段测试代码:
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
class Observer {
public:
virtual void update(string str) = 0;
};
class Subject {
public:
virtual void registerObserver(Observer*) = 0;
virtual void removeObserver(Observer*) = 0;
virtual void notifyObserver() = 0;
};
// 显示数据接口
class Display {
public:
virtual void display() = 0;
};
class SubjectImpl : public Subject {
public:
SubjectImpl(){
info = "123";
}
void registerObserver(Observer* o){
observers.push_back(o);
}
void removeObserver(Observer* o)
{
list<Observer*>::iterator it = find(observers.begin(), observers.end(), o);
if ( it != observers.end() )
observers.remove(o);
}
void notifyObserver(){
list<Observer*>::iterator it = observers.begin();
while(it != observers.end()) {
(*it)->update(info);
++it;
}
}
// 模拟数据发生改变
void dataChanged(){
info = "456";
notifyObserver();
}
private:
list<Observer*> observers;
string info;
};
class ObserverImpl : public Observer, public Display{
public:
ObserverImpl(Subject* sub){
mySubject = sub;
mySubject->registerObserver(this);
}
void update(string str)
{
data = str;
display();
}
void display()
{
cout << data << endl;
}
private:
Subject* mySubject;
string data;
};
int main()
{
SubjectImpl *impl = new SubjectImpl();
ObserverImpl *obimpl = new ObserverImpl(impl);
impl->dataChanged();
return 0;
}设计模式初探2——观察者模式(Observer Pattern)
原文地址:http://blog.csdn.net/cloud_castle/article/details/40717189