Matlab观察者模式
要点:
1、服务端(Subject)维护一个观察者的列表,以便能够向所有的观察者(Observer)推送信息
2、观察者可以获取服务端的状态
3、服务端和观察者可抽象,可以有多个不同实现
Subject.m
classdef Subject < handle
properties(Access = private)
observers = Observer.empty();
end
methods
function add(obj,observer)
obj.observers(end + 1) = observer;
end
function rm(obj,observer)
index = [obj.observers] ~= observer;
obj.observers = obj.observers(index);
end
function notify(obj)
for i= 1:length(obj.observers)
obj.observers(i).update(obj);
end
end
end
end
ConcreteSubject.m
classdef ConcreteSubject < Subject
properties(Access = public)
news
end
methods
function set.news(obj,news)
obj.news = news;
end
function news = get.news(obj)
news = obj.news;
end
end
end
Observer.m
classdef Observer < handle & matlab.mixin.Heterogeneous
methods(Abstract)
update(~,~);
end
methods(Sealed)
function res = eq(obj1,obj2)
res = eq@handle(obj1,obj2);
end
function res = ne(obj1,obj2)
res = ne@handle(obj1,obj2);
end
end
end
ConcreteObserver1.m
classdef ConcreteObserver1 < Observer
properties
name
end
methods
function obj = ConcreteObserver1(name)
obj.name = name;
end
function update(obj,subject)
disp([obj.name, ' has got subject news: ',subject.news]);
end
end
end
ConcreteObserver2.m
classdef ConcreteObserver2 < Observer
properties
name
end
methods
function obj = ConcreteObserver2(name)
obj.name = name;
end
function update(obj,subject)
disp([obj.name, ' has received subject news: ',subject.news ]);
end
end
end
测试代码:
sub = ConcreteSubject();
sub.news = 'hello matlab';
o1 = ConcreteObserver1('obs:a');
o2 = ConcreteObserver2('obs:b'); sub.add(o1);
sub.add(o2);
sub.notify(); sub.rm(o1);
sub.news = 'hello observer pattern';
sub.notify();
Matlab自带event事件使用的是发布-订阅者模式,与观察者模式类似(区别参考:https://www.cnblogs.com/viaiu/p/9939301.html),代码如下:
classdef EventPublisher < handle
events
msgRecv
end
properties
name
end
methods
function obj = EventPublisher(name)
obj.name = name;
end
function sendMsg(obj,msg)
obj.notify('msgRecv',EventMessage(msg));
end
end
end
EventSubscriber.m
classdef EventSubscriber < handle
properties
name
end
methods
function obj = EventSubscriber(name)
obj.name = name;
end
%可以是普通函数、静态函数和成员函数
function dispMsg(obj,src,data)
disp("["+data.time+"]"+obj.name + ":"+data.msg+" from "+src.name);
end
end
end
EventMessage.m
classdef EventMessage < event.EventData
properties
msg
time
end
methods
function obj = EventMessage(msg)
obj.time = datestr(now);
obj.msg = msg;
end
end
end
测试代码
pub = EventPublisher("pub1");
sub = EventSubscriber("sub1");
h = pub.addlistener('msgRecv',@sub.dispMsg);
pub.sendMsg("matlab event");
delete(h);
pub.sendMsg("matlab event");
Matlab观察者模式的更多相关文章
- Matlab 绘制三维立体图(以地质异常体为例)
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- Matlab slice方法和包络法绘制三维立体图
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- Matlab 高斯_拉普拉斯滤波器处理医学图像
前言:本程序是我去年实现论文算法时所做.主要功能为标记切割肝脏区域.时间有点久,很多细节已经模糊加上代码做了很多注释,因此在博客中不再详述. NOTE: 程序分几大段功能模块,仔细阅读,对解决医学图像 ...
- 23种设计模式--观察者模式-Observer Pattern
一.观察者模式的介绍 观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...
- 谈谈JS的观察者模式(自定义事件)
呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...
- MATLAB中绘制质点轨迹动图并保存成GIF
工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...
- ObserverPattern(观察者模式)
import java.util.ArrayList; import java.util.List; /** * 观察者模式 * @author TMAC-J * 牵一发而动全身来形容观察者模式在合适 ...
- java观察者模式
像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...
- linux下配置matlab运行环境(MCR)
在安装好的matlab下有MCR(MatlabCompilerRuntime)在matlab2011/toolbox/compiler/deploy/glnxa64下找到MCRInstaller.zi ...
随机推荐
- mysql注入写文件
select * from admin where id =-1 union select 1,'<?php phpinfo();?>',3,4 into outfile 'c:\\1.p ...
- web项目脱敏白名单管理
写在前面 下午没事, 看一下同事写的脱敏白名单管理功能. 所谓的脱敏就是将页面中查询出的信息列表当中的身份证号及手机号等关键信息部分用*号代替.该功能主要思路是新增一个页面用于配置哪些页面以及页面中哪 ...
- springboot装配OkHttp组件
在SpringBoot应用中,发送Http通常我们使用RestTemplate,但有部分组件底层是使用OkHttp进行Http的操作,而且OKHttp也是一个很优秀的HTTP组件. RestTempa ...
- 2019年MTP管理技能提升培训笔记
2019年MTP管理技能提升培训笔记 管理专题培训–MTP管理技能提升培训 高水准的问题分析解决 何为高水准 高 多层探寻,高度分析,即需要有深度 水 团队讨论,水平思考,即需要有广度 准 预防应变, ...
- Java学习-058-Jsoup爬虫获取中国所有的三级行政区划数据(三),处理二级编码缺失
通过查看数据可知,直辖市或者某些三级行政区域没有对应的二级区域,为方便后续的地址使用,可自定义缺失的二级地址. 如下示例自定义的二级行政区域的名称为一级区域的名称,对应的源码如下所示: 将此段源码添加 ...
- Python3基础 from...import...as 解决局部导入时的函数名重复问题
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- java多线程(五)线程通讯
1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...
- EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案之使用RTSP流判断摄像机设备是否在线以及快照抓取
背景分析 熟知EasyNVR产品的小伙伴都知道,通过纯Web化的交互方式,只要配置出摄像机的IP.端口.用户名.密码等信息,就可以将地址进行通道配置完成,即可将设备接入.如果设备支持Onvif协议,E ...
- linux 下core文件生成、路径、格式设置及调试
core文件生成及调试1 代码 #include<stdio.h> int main() { int *p = NULL; *p = 0; return 0; } 2 在当前shell执行 ...
- navcat excel数据导入mysql的方法
navcat excel数据导入mysql的方法 先navcat导出 xls格式 然后把数据复制到往这个xls里 (按照这个xls格式) 然后导入mysql就行了 如果导入的过程无法识别excel里的 ...