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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月26日 05时10分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
tf rnn layer
2019-04-30
常用中间件
2019-04-30
tf input layer
2019-04-30
tf model create
2019-04-30
tf dense layer两种创建方式的对比和numpy实现
2019-04-30
tf initializer
2019-04-30
tf 从RNN到BERT
2019-04-30
tf keras SimpleRNN源码解析
2019-04-30
tf keras Dense源码解析
2019-04-30
tf rnn输入输出的维度和权重的维度
2019-04-30
检验是否服从同一分布
2019-04-30
tf callbacks
2019-04-30
keras、tf、numpy实现logloss对比
2019-04-30
Ubuntu20.04安装微信
2019-04-30
Restful风格的使用
2019-04-30
Swagger基础入门整合SpringBoot
2019-04-30
MyBatisPlus简单入门(SpringBoot)
2019-04-30
攻防世界web进阶区NewsCenter详解
2019-04-30
攻防世界web进阶PHP2详解
2019-04-30
如何解决词达人问题(新)
2019-04-30