随着交通信号灯的变化,汽车的行为也将随之变化,一盏交通信号灯可以指挥多辆汽车。
在软件系统中,有些对象之间也存在类似交通信号灯和汽车之间的关系,一个对象状态或者行为的变化将导致其他对象的状态或者行为也发生变化,它们之间将产生联动。为了更好的描述对象之间存在的这种一对多(包括一对一)的联动,观察者模式应运而生,它定义对象之间一对多的依赖关系,让一个对象的改变能够影响其它对象。
#include <list>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
class Subject;
//Observer接口:抽象观察者
class Observer{
private:
string name;
public:
Observer(string n):name(n){
}
string getName(){
return name;
}
virtual void update(Subject* s)=0;
};
//Subject接口:抽象主题
class Observer;
class Subject{
protected:
//定义一个观察者集合用于存储所有观察者对象
list<Observer*> observerList;
public:
//注册方法,用于向观察者集合增加一个观察者
virtual void registerObserver(Observer* observer){
cout<<observer->getName()<<"向猎头注册"<<endl;
observerList.push_back(observer);
};
//注销方法,用于在观察者集合中删除一个观察者
virtual void removeObserver(Observer* observer){
list<Observer*>::iterator iter=find(observerList.begin(),observerList.end(),observer);
if(iter==observerList.end()){
cout<<observer->getName()<<"没有向猎头注册"<<endl;
}else{
cout<<(*iter)->getName()<<"取消向猎头注册"<<endl;
observerList.erase(iter);
}
return;
}
//声明抽象通知方法
virtual void notifyAllObserver()=0;
};
//Hunter类:具体主题
class Hunter : public Subject{
private:
list<string> jobs;
public:
Hunter(){}
//实现通知方法
void notifyAllObserver(){
list<Observer*>::iterator iter=observerList.begin();
//遍历观察者集合,调用每一个观察者的响应方法
while(iter!=observerList.end()){
(*iter)->update(this);
++iter;
}
}
//添加工作
void addJob(string jobName){
jobs.push_back(jobName);
//观察目标发生变化,通知所有观察者
notifyAllObserver();
}
//得到工作列表
void getJobs(){
list<string>::const_iterator iter=jobs.begin();
cout<<"可提供的工作最新列表:"<<endl;
while(iter!=jobs.end()){
cout<<*iter<<endl;
++iter;
}
}
};
//JobSeeker:具体观察者
class JobSeeker : public Observer{
public:
JobSeeker(string name):Observer(name){
}
void update(Subject *s){
cout<<getName()<<"得到猎头通知!"<<endl;
((Hunter*)s)->getJobs();//此处没有针对抽象编程
}
};
//客户端测试代码
int main(){
Hunter *hunter=new Hunter();
Observer *observer1,*observer2;
observer1=new JobSeeker("Mike");
observer2=new JobSeeker("Jeff");
hunter->registerObserver(observer1);
hunter->registerObserver(observer2);
hunter->addJob("Google Job");
hunter->addJob("Yahoo Job");
hunter->removeObserver(observer1);
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/sxhlovehmm/article/details/46891801