C++设计模式之一:观察者模式

观察者模式定义了对象间的依赖关系,以至于一个对象的改变,依赖它的对象都会收到通知。
求职者订阅了某职位发布网站, 当有何时的职位出现时, 他们会收到通知.

#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中,当接收到消息时要调用通知函数将消息传递给所有绑定的消息接收者

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值