当前位置: 首页 > 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;
}

相关文章:

  • 威胁建模与网络安全测试方法
  • Android adb 常用命令
  • mysql的一些基本操作
  • Oracle 使用维进行查询重写
  • Flutter Don‘t use ‘BuildContext‘s across async gaps.
  • Jmeter各组件超详细介绍
  • Git命令(1)[删除,恢复与移动]
  • Stable Diffusion WebUI 图片信息(PNG Info)
  • H5面临的网络安全威胁和防范措施
  • 机器学习KNN最邻近分类算法
  • Taro + vue3 小程序封装标题组件
  • 开源代码分享(17)-基于足球队训练算法(Football Team Training Algorithm,FTTA)的组合风速预测
  • css预编译sass,css也可以变得优雅
  • Audition 2024:声音的魔术师,赋予音频无限魅力mac/win版
  • 用6位元素(每位元素规定取值范围)生成6位互不相同元素的数组,用于解数独
  • hexo+github搭建个人博客
  • 【个人向】《HTTP图解》阅后小结
  • 07.Android之多媒体问题
  • gcc介绍及安装
  • IDEA常用插件整理
  • Invalidate和postInvalidate的区别
  • JavaScript异步流程控制的前世今生
  • PHP的类修饰符与访问修饰符
  • 基于遗传算法的优化问题求解
  • 记录:CentOS7.2配置LNMP环境记录
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 面试总结JavaScript篇
  • 如何优雅地使用 Sublime Text
  • 自制字幕遮挡器
  • nb
  • 白色的风信子
  • ​ArcGIS Pro 如何批量删除字段
  • ​HTTP与HTTPS:网络通信的安全卫士
  • #include<初见C语言之指针(5)>
  • (04)odoo视图操作
  • (1)(1.9) MSP (version 4.2)
  • (9)STL算法之逆转旋转
  • (ibm)Java 语言的 XPath API
  • (libusb) usb口自动刷新
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (四)Controller接口控制器详解(三)
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)甲方乙方——赵民谈找工作
  • .bat批处理(一):@echo off
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net core 6 集成和使用 mongodb
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET下的多线程编程—1-线程机制概述
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [C\C++]读入优化【技巧】