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 ...
随机推荐
- .NETCore websocket
.NETCore websocket 实现简易.高性能.集群即时通讯组件,支持点对点通讯.群聊通讯.上线下线事件消息等众多实用性功能. https://github.com/2881099/im
- Future home of something quite cool.
我绑定二级域名的时候显示内页如下,怎么办??一级主域名没问题呀~ Future home of something quite cool.If you're the site owner, log i ...
- Fiddler添加过滤条件
- [Web] HTML5新特性history pushState/replaceState解决浏览器刷新缓存
转载: https://www.jianshu.com/p/cf63a1fabc86 现实开发中,例如‘商品列表页’跳转‘商品详情页’,返回时,不重新加载刷新页面,并且滚动到原来的位置. 1.首先,先 ...
- save tracking results into csv file for oxuva long-term tracking dataset (from txt to csv)
save tracking results into csv file for oxuva long-term tracking dataset (from txt to csv) 2019-10-2 ...
- centos7安装python3.7.4和pip3
亲测有效,针对 阿里云 centos 7 轻量服务器 python ==> 3.7.4 pip ==> 3 一,打开python官网,找到下载Python的tgz文件,有两种方式下载 ( ...
- linux下检查网络连通情况
MTR是一种简单的跨平台命令行网络诊断工具,它将常用的traceroute和ping程序的功能组合到一个工具中. 与traceroute类似, mtr输出关于数据包从运行mtr的主机到用户指定的目标主 ...
- tp的增删改查的结果判断?
参考: https://blog.csdn.net/qq_27930635/article/details/78853908 总之, 要用 全等 来判断, = = = 注意, 不要再用 mysql_a ...
- linux zip命令 tar命令 【压缩、解压缩】参数列表:
linux zip命令参数列表: -a 将文件转成ASCII模式 -F 尝试修复损坏的压缩文件 -h 显示帮助界面 -m 将文件压缩之后,删除源文件 -n 特定字符串 不压缩具有特定字尾字符串 ...
- flow
Flow vs Stream https://wikidiff.com/flow/stream As nouns the difference between flow and stream is t ...