定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆可得到通知并被自动更新。
观察者模式又叫做发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听器(Source-Listener)模式。
从类图可知, MySubject需要保存(关联)MyObserver的对象,当MySubject发出通知时cry(),将会遍历ArrayList中的MyObserver的response函数,来实现MyObserver观察者(被动)更新的效果。
下面是c++实现的版本
抽象观察者MyObserver
//抽象观察者MyObserver
class MyObserver{
public:
virtual void response();
};
抽象目标类MySubject
//抽象目标类MySubject
class MySubject{
public:
//注册
void attach(MyObserver *observer){
observers.push_back(observer);
}
//注销
void detach(MyObserver *observer){
for(auto it = observers.begin() ; it!=observers.end() ; it++){
if(*it == observer){
observers.erase(it);
break;
}
}
}
protected:
vector observers;
};
具体目标类Cat(猫类)
//具体目标类Cat(猫类)
class Cat : public MySubject{
public:
void cry(){
cout << "猫叫!" << endl;
for(auto obs : observers){
obs->response();
}
}
};
具体观察者类Mouse(老鼠类)
//具体观察者类Mouse(老鼠类)
class Mouse : public MyObserver{
public:
void response(){
cout << "老鼠逃跑!" << endl;
}
};
具体观察者类Dog(狗类)
//具体观察者类Dog(狗类)
class Dog : public MyObserver{
public:
void response(){
cout << "狗叫!" << endl;
}
};
客户端测试
//客户端测试
int main(void){
//创建目标
Cat cat;
//创建观察者
Mouse m1,m2;
Dog dog;
//订阅
cat.attach(&m1);
cat.attach(&m2);
cat.attach(&dog);
//更新
cat.cry();
return 0;
}
输出结果