观察者模式
时间:2019-10-26
本文章向大家介绍观察者模式,主要包括观察者模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
观察者模式:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。简单的来说就是发布者发布信息,观察者收到信息后,做出反应。
观察者模式定义了对象间一对多的依赖关系,主要解决的是对象状态改变给其他对象通知的问题,同时还要易用性和低耦合度。
实现:
观察者模式使用三个类Subject、Observer和Client。
1、创建Subject类。
1 class Subject 2 { 3 private: 4 vector<Observer*> observers; 5 int state; 6 7 public: 8 9 void setState(int state) 10 { 11 //状态改变 12 this->state = state; 13 notifyAllObservers(); 14 } 15 16 void notifyAllObservers() 17 { 18 /* 19 vector<Observer*>::iterator ObsIter = observers.begin(); 20 //观察者做出响应 21 for (; ObsIter!=observers.end(); ++ObsIter) 22 { 23 (*ObsIter)->update(); 24 } 25 */ 26 for (auto v : observers) 27 { 28 v->update(); 29 } 30 } 31 //添加观察者 32 void addObserver(Observer* observer) 33 { 34 observers.push_back(observer); 35 } 36 };
2、创建Observer接口
class Observer { public: virtual void update() = 0; virtual ~Observer() {}; };
3、创建Observer实体观察者
1 class AObserver : public Observer 2 { 3 public: 4 virtual void update() 5 { 6 cout << "this is AObserver, Subject.state change" << endl; 7 } 8 }; 9 10 class BObserver : public Observer 11 { 12 public: 13 virtual void update() 14 { 15 cout << "this is BObserver, Subject.state change" << endl; 16 } 17 };
4、使用Subject和Observer实体观察者
1 class Client 2 { 3 public: 4 Client() 5 { 6 subject->addObserver(aObserver); 7 subject->addObserver(bObserver); 8 } 9 void changeSubjectState() 10 { 11 this->subject->setState(1); 12 } 13 private: 14 Subject* subject = new Subject(); 15 Observer* aObserver = new AObserver(); 16 Observer* bObserver = new BObserver(); 17 }; 18 19 int main() 20 { 21 Client client; 22 client.changeSubjectState(); 23 }
观察者模式优缺点:
优点:1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点:1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
原文地址:https://www.cnblogs.com/qiu00/p/11708170.html
- Tomcat 快速入门
- 服务器进程异常的原因分析(r6笔记第74天)
- Elastic 技术栈之 Filebeat
- Elastic 技术栈之 Logstash 基础
- 备库CPU使用异常优化(r6笔记第73天)
- 数据清理的遗留问题处理(二)(r6笔记第91天)
- Kaggle Titanic 生存预测比赛超完整笔记(上)
- 多系统交互中DBA需要实现的技术细节(r6笔记第90天)
- Kaggle Titanic 生存预测比赛超完整笔记(中)
- SDP(11):MongoDB-Engine功能实现
- SDP(10):文本式大数据运算环境-MongoDB-Engine功能设计
- Kaggle Titanic 生存预测比赛超完整笔记(下)
- SDP(9):MongoDB-Scala - data access and modeling
- 数据清理的遗留问题处理(r6笔记第87天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android实现屏幕录制功能
- Android实现扫描二维码功能
- android实现录屏功能
- android自定义手表效果
- Android 测量文字宽度的实例方法
- Android 添加系统服务的方法详解
- android实现录屏小功能
- Android控件CardView实现卡片效果
- 非常好看的android音量旋钮
- Android实现按钮拖拽还原功能
- 百度地图实现小车规划路线后平滑移动功能
- frp内网穿透部署搭建教程,内网端口暴露给了外网
- Android使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信界面
- Linux安装Collabora Online让NextCloud支持Office在线编辑
- 教你在CentOS7安装Vuze(Azureus)