观察者模式定义了对象间的依赖关系,以至于一个对象的改变,依赖它的对象都会收到通知。
求职者订阅了某职位发布网站, 当有何时的职位出现时, 他们会收到通知.
#include <iostream>
#include <string>
#include <list>
#include <functional>
//消息类
class JobPost {
public:
JobPost(const std::string& title): title_(title) {}
const std::string& GetTitle() const { return title_; }
private:
std::string title_;
};
//观察者类
class IObserver {
public:
virtual void OnJobPosted(const JobPost& job) = 0;
};
class JobSeeker : public IObserver {
public:
JobSeeker(const std::string& name): name_(name) {}
void OnJobPosted(const JobPost &job)
{
std::cout << "Hi " << name_ << "! New job posted: " << job.GetTitle() << std::endl;
}
private:
std::string name_;
};
//消息传递接口,Attach绑定观察者,AddJob接收消息,Notify将消息传递给所有绑定观察者。
class IObservable {
public:
virtual void Attach(IObserver* observer) = 0;
virtual void AddJob(const JobPost& jobPosting) = 0;
protected:
virtual void Notify(const JobPost& jobPosting) = 0;
};
class JobPostings : public IObservable {
public:
void Attach(IObserver* observer) //绑定观察者
{
observers_.push_back(observer);
}
void AddJob(const JobPost &jobPosting) //添加信息
{
Notify(jobPosting); //将信息传递给观察者
}
private:
void Notify(const JobPost & jobPosting)
{
std::list<IObserver *>::iterator it;
for(it = observers_.begin(); it!=observers_.end(); it++) //遍历
{
(*it)->OnJobPost(jobPosting);
}
}
std::list<IObserver *> observers_; //链表保存观察者
};
int main()
{
JobSeeker johnDoe("John Doe");
JobSeeker janeDoe("Jane Doe");
JobPostings jobPostings;
jobPostings.Attach(&johnDoe);
jobPostings.Attach(&janeDoe);
jobPostings.AddJob(JobPost("Software Engineer"));
}
总结:
JobPost是信息
JobSeeker是信息接收者
JobPostings是传递信息的接口
传递消息的接口JobPostings调用 attach 绑定 消息接收者JobSeeker对象
传递消息的接口JobPostings 调用 addjob 接收消息JobPost
addjob会自动调用notify私有成员函数,从list中遍历绑定的消息接收者JobSeeker对象
并将消息JobPost 传递给 消息接收者JobSeeker 的成员函数OnJobPosted打印消息
JobPostings是消息和消息接收者的中间桥梁,一方面要定义成员函数来接收消息,一方面要定义成员函数来绑定多个消息接收者,保存在list中,当接收到消息时要调用通知函数将消息传递给所有绑定的消息接收者