C++设计模式-观察者模式
发布日期:2021-06-30 11:01:59 浏览次数:2 分类:技术文章

本文共 2531 字,大约阅读时间需要 8 分钟。

目录

 

 


 

基本概念

观察者模式又叫做发布-订阅模式;

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动的更新自己。

对应的UML如下(此图来源于 大话设计模式):

 

代码与实例

下面给出C++的实例,程序运行截图如下:

本人目前水平对这个模式的实用地方,个人觉得有以下几个地方:

服务器发布新版本,让客户端更新。

游戏群发邮件给补贴等。

聊天室系统。

等。

都可以很好的套用这种模式。

源码如下:

Head.h

#ifndef HEAD_H#define HEAD_H#include 
#include
#include
using namespace std;class Observer;class Subject{public: void attach(Observer *observer); void detach(Observer *observer); void notify(); ~Subject();private: list
observers;};class Observer{public: virtual void update(){} virtual string getName(){ return ""; }};class ConcreteSubject : public Subject{public: string getSubjectState(); void setSubjectState(const string &str);private: string subjectState;};class ConcreteObserver : public Observer{public: ConcreteObserver(ConcreteSubject *subject, string name); void update(); string getName();private: string name; string observerState; ConcreteSubject *subject;};#endif //HEAD_H

Head.cpp

#include "Head.h"void Subject::attach(Observer *observer){	observers.push_back(observer);}void Subject::detach(Observer *observer){	observers.remove(observer);}void Subject::notify(){	list
::iterator it = observers.begin(); while(it != observers.end()){ (*it)->update(); it++; }}Subject::~Subject(){ cout << "开始析构了" << endl; list
::iterator it = observers.begin(); while(it != observers.end()){ cout << "开始删除: " << (*it)->getName() << endl; delete *it; it++; } observers.clear();}std::string ConcreteSubject::getSubjectState(){ return subjectState;}void ConcreteSubject::setSubjectState(const string &str){ subjectState = str;}ConcreteObserver::ConcreteObserver(ConcreteSubject *subject, string name){ this->subject = subject; this->name = name;}void ConcreteObserver::update(){ observerState = subject->getSubjectState(); cout << "发布者更新东西了 !!! 订阅者:" << name << " 状态:" << observerState << endl; }std::string ConcreteObserver::getName(){ return name;}

main.cpp

#include "Head.h"int main(int *argc, int *argv[]){	ConcreteSubject *subject = new ConcreteSubject;	subject->attach(new ConcreteObserver(subject, "第一个粉丝"));	subject->attach(new ConcreteObserver(subject, "第二个粉丝"));	subject->attach(new ConcreteObserver(subject, "第三个粉丝"));	subject->setSubjectState("Hello");	subject->notify();	cout << "----------- 华 丽 的 分 割 线 -----------" << endl;	subject->attach(new ConcreteObserver(subject, "王二麻子"));	subject->setSubjectState("呵呵");	subject->notify();	cout << endl;	delete subject;	getchar();	return 0;}

 

转载地址:https://it1995.blog.csdn.net/article/details/93843990 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:RabbitMQ笔记-使用rabbitmq-c实现Fair dispatch(公平分发)
下一篇:C++设计模式-建造者模式

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月26日 05时10分01秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章