观察者模式的应用遍布在我们的生活中,比如在class="superseo">csdn中,当你关注的博主发布新的文章的时候,他的所有粉丝都会收到相关的通知,作为粉丝的你看到这个通知之后,可能会忽略也可能会点进去相关链接查看。因此,以CSDN博主与粉丝之间的关系为例,介绍并使用C++实现这个常用的观察者与消费者模式(发布-订阅模式),为了后续描述方便,使用发布者与订阅者模式代替观察者模式。这其中主要涉及到四个类别:抽象发布者类,具体发布者类,抽象订阅者类以及具体订阅者类。
1. 抽象发布者类以及抽象订阅者类其中,Fans类表示订阅者类的抽象类,而Blogger表示发布者的抽象类。当发布者发布博客的时候,就会通知Fans类,Fans类就会更新它们各自的信息。
class Fans{
public:
string status;
virtual void update(const string&) = 0;
virtual void show() = 0;
};
class Blogger{
protected:
list fans_lst;
public:
Blogger(){};
virtual ~Blogger(){};
virtual void attach(Fans* fans){
fans_lst.push_back(fans);
}
virtual void detach(Fans* fans){
fans_lst.remove(fans);
}
virtual void notify() = 0;
};
为了能够让发布者状态更新的时候,每个订阅者都能够得到状态更新的消息,就需要在发布者中设置一个list属性,list就像是一个电话通讯录,每当发布者状态更新时,它就会挨个挨个打电话通知订阅者。
2. 具体订阅者类在具体订阅者类中,移动实例化了两个订阅者。
class FansZhang:public Fans{
private:
string id;
public:
FansZhang():id("zhangSan"){};
FansZhang(string name):id(name){};
~FansZhang(){};
void update(const string& info){
status = info;
};
void show(){
cout << "["<< id << "] >> 接收到的消息是: "<< status << endl;
}
};
class FansLiu:public Fans{
private:
string id;
public:
FansLiu():id("Liu"){};
FansLiu(string name):id(name){};
~FansLiu(){};
void update(const string& info){
status = info;
};
void show(){
cout << "["<< id << "] >> 接收到的消息是: "<< status << endl;
}
};
3. 具体发布者类
在具体发布者类中,由于notify()函数中需要使用每个发布者的名字,因此就将notify()函数放在实例中进行显示了。
class OreoBlogger:public Blogger{
private:
string name;
public:
OreoBlogger(){};
OreoBlogger(string name):name(name){};
~OreoBlogger(){};
void notify(){
for(list::iterator it = fans_lst.begin(); it != fans_lst.end(); ++it){
const string info = name +"更新博客了";
(*it)->update(info);
};
}
};
4. 主函数测试效果
下面就是测试代码:
int main(){
Fans* zhang = new FansZhang();
Fans* liu = new FansLiu();
Blogger* oreo = new OreoBlogger("oreo");
oreo->attach(zhang);
oreo->attach(liu);
// oreo博主更新了博客
oreo->notify();
// zhang打印消息,liu打印消息
zhang->show();
liu->show();
return 0;
}
下面就是测试结果:
5. 参考文献
(1) 设计模式C++实现(15)——观察者模式_wuzhekai1985的博客-CSDN博客_c++观察者模式
(2) 史上最全设计模式导学目录(完整版)_LoveLion的博客-CSDN博客
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)