行为型模式之观察者模式实现
来源:互联网 发布:液晶电视修理用编程器 编辑:程序博客网 时间:2024/06/06 00:04
概念
观察者(Observer)模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的对象之间保持状态同步。
角色和职责
Subject(被观察者):被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject:被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者):接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver:观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。
典型应用
侦听事件驱动程序设计中的外部事件;
侦听/监视某个对象的状态变化;
发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者。
适用于:定义对象间一种一对多的依赖关系,使得每一个对象改变状态,则所有依赖于他们的对象都会得到通知。
使用场景:定义了一种一对多的关系,让多个观察对象(公司员工)同时监听一个主题对象(秘书),主题对象状态发生变化时,会通知所有的观察者,使它们能够更新自己。
案例
#include <iostream>using namespace std;#include "vector"#include "string"class Secretary;//玩游戏的同事类(观察者)class PlayserObserver{public: PlayserObserver(string name, Secretary *secretary) { m_name = name; m_secretary = secretary; } void update(string action) { cout << "观察者收到action:" << action << endl; }private: string m_name; Secretary *m_secretary;};//秘书类(主题对象,通知者)class Secretary{public: void addObserver(PlayserObserver *o) { v.push_back(o); } void Notify(string action) { for (vector<PlayserObserver *>::iterator it = v.begin(); it != v.end(); it++) { (*it)->update(action); } } void setAction(string action) { m_action = action; Notify(m_action); }private: string m_action; vector<PlayserObserver *> v;};void main(){ //subject 被观察者 Secretary *s1 = new Secretary; //具体的观察者 被通知对象 PlayserObserver *po1 = new PlayserObserver("小张", s1); //PlayserObserver *po2 = new PlayserObserver("小李", s1); s1->addObserver(po1); //s1->addObserver(po2); s1->setAction("老板来了"); s1->setAction("老板走了"); cout << "hello..." << endl; system("pause"); return;}
阅读全文
0 0
- 行为型模式之观察者模式实现
- 行为型之观察者模式
- 行为型之观察者模式
- 观察者模式--行为型模式之三
- 行为型模式-观察者模式之监听器
- 设计模式-行为型之观察者模式
- 行为型模式之观察者模式
- 行为模式之-观察者模式
- 行为模式之观察者模式
- 行为模式之观察者模式
- 行为模式之观察者模式
- 行为模式之观察者模式
- 行为型-观察者模式
- 行为型模式-观察者
- 行为型--观察者模式
- 观察者模式(行为型)
- 观察者模式(行为型)
- 观察者模式(行为型)
- java中volatile关键字的含义
- opencv学习笔记-4、调整图像亮度和对比度
- Unity如何使用WWW类和协程完成图片、视频下载播放
- 滑动窗口的最大值
- android Binder 机制学习
- 行为型模式之观察者模式实现
- 大型网站架构演化
- Android EditText属性API
- 实现vux组件跳转
- 设计模式之迭代子模式(Iterator)
- chromium gn args报错记录1
- mysql-Linux下安装
- 响应式(自适应)网页到底是什么?
- C语言基础之结构体和共用体