当前位置: 首页 > news >正文

设计模式 --5观察者模式

观察者模式

在这里插入图片描述

观察者模式的优缺点

优点

  • 当一个对象改变的时候 需要同时改变其他对象的相关动作的时候 ,而且它不知道有多少具体的对象需要改变 应该考虑使用观察者模式 。
  • 观察者模式的工作就是解除耦合 让耦合双方都依赖与抽象 而不是具体 是的各自改变都不会影响另一边工作

缺点

  • 具体的观察类里面的update方法太单调了 现实是每个观察者的动作都可能都所不同

可以使用两种方式去解决此类问题
1:具体的观察者实现具体的 自己需要完成的任务 在继承抽象Observer后 在update内部直接调用具体的方式
2:具体的观察者将自己具体的动作也同时注册到 通知类里面 改变通知类里面的容器为map容器类 key为具体的观察者 value为具体的处理函数

代码

只实现基础部分
在这里插入图片描述

#include <iostream>  
#include <set>  
using namespace std;// 抽象观察者  
class Observer {
public:virtual void update(const string& subjectState) = 0;
};// 抽象主题  
class Subject {
public:virtual void Attach(Observer* observer) = 0;virtual void Detach(Observer* observer) = 0;virtual void Notify(const string& state) = 0;virtual string GetSubjectState() const = 0;virtual void SetSubjectState(const string& state) = 0;
};// 具体主题  
class ConcreteSubject : public Subject {
public:void Attach(Observer* observer) override {observers.insert(observer);}void Detach(Observer* observer) override {observers.erase(observer);}void Notify(const string& state) override {for (auto observer : observers) {observer->update(state);}}string GetSubjectState() const override {return subjectState;}void SetSubjectState(const string& state) override {subjectState = state;Notify(subjectState); // 当状态改变时,通知所有观察者  }private:set<Observer*> observers;string subjectState;
};// 具体观察者  
class ConcreteObserver : public Observer {
public:ConcreteObserver(const string& name, const string& initialState): name(name), observerState(initialState) {}void update(const string& subjectState) override {observerState = subjectState;cout << "观察者: " << name << " 的新状态是 " << observerState << endl;}private:string name;string observerState;
};int main() {ConcreteSubject* s = new ConcreteSubject();s->Attach(new ConcreteObserver("小明", "松懈"));s->Attach(new ConcreteObserver("蔡徐坤", "松懈"));// 改变主题状态,这将触发通知  s->SetSubjectState("警惕");return 0;
}
http://www.lryc.cn/news/332596.html

相关文章:

  • 跨平台的组播测试工具mping、udp_sender及udp_reciver的源码及使用教程
  • Linux基础篇:文件系统介绍——根目录下文件夹含义与作用介绍
  • vulhub中Apache Solr RemoteStreaming 文件读取与SSRF漏洞复现
  • PHP在线加密系统网站源码
  • 【C++】哈希思想的应用(位图、布隆过滤器)及海量数据处理方法
  • 蓝桥杯(5):python动态规划DF[2:背包问题]
  • 臻奶惠无人售货机:新零售时代的便捷消费革命
  • 4月04日,每日信息差
  • C++数据结构——顺序表——数值统计
  • Linux+HA高可用24X7的安全保证
  • 【Tomcat】Apache官方结束Tomcat 8.5分支版本技术支持
  • Go 源码之读写锁 sync.RWMutex
  • 大数据实验统计-1、Hadoop安装及使用;2、HDFS编程实践;3、HBase编程实践;4、MapReduce编程实践
  • PyTorch搭建Informer实现长序列时间序列预测
  • firefox切换本地服务和全球服务的方法
  • Windows下用CMake编译PugiXML及配置测试
  • python-基础篇-字符串、列表、元祖、字典-列表
  • Qt控件样式设置其一(常见方法及优缺点)
  • 软件测试(测试用例详解)(三)
  • 最优算法100例之33-字符串/数字的排列组合问题
  • Java面试题:请解释Java中的多线程编程?
  • acwing算法提高之图论--最小生成树的扩展应用
  • 政安晨:【Keras机器学习实践要点】(十七)—— 利用 EfficientNet 通过微调进行图像分类
  • wordpress全站开发指南-面向开发者及深度用户(全中文实操)--php函数
  • Linux 设备驱动管理之内核对象(Kernel Object)机制
  • 【C语言】关键字选择题
  • 营销中的归因人工智能
  • ChatGPT 的核心 GPT 模型:探究其生成式预训练变换架构的革新与应用潜力
  • Python | Leetcode Python题解之第10题正则表达式匹配
  • 华大单片机新建工程步骤