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 ...
随机推荐
- SNPsnap | 筛选最佳匹配的SNP | 富集分析 | CP loci
一个矛盾: GWAS得到的SNP做富集分析的话,通常都会有强的偏向性. co-localization of GWAS signals to gene-dense and high linkage d ...
- windows server core 2016 IIS远程管理的那些坑
打算从win10访问数据中心版2016 core,结果IIS远程管理不了. 需要修改core上防火墙和注册表,开启一些相关服务. 具体需要如下操作. 1.win10 启用IIS管理特性 2.参考htt ...
- Android Studio 3.4 修改 .android 和.gradle缺省目录-windows7x64专业版环境。
说明:缺省会在用户目录建立.android和.gradle目录.会挤满C盘.可以改变缺省目录. 改变.gradle目录路径示例,修改到D:\android目录,步骤: 1.建立d:\android目录 ...
- Jav获取文件的MD5码,比较两个文件内容是否相同
Jav获取文件的MD5码,比较两个文件内容是否相同 代码: System.out.println(DigestUtils.md5Hex(new FileInputStream(new File(&qu ...
- MQTT研究之EMQ:【eclipse的paho之java客户端使用注意事项】
这里,简单记录一下自己在最近项目中遇到的paho的心得,这里也涵盖EMQX的问题. 1. cleanSession 这个标识,是确保client和server之间是否持久化状态的一个标志,不管是cli ...
- 【转】Python查找某文件夹下的所有excel文件
# -*- coding: utf-8 -*- # author:baoshan import os dirname = r'D:\0.shenma\01.聊城资料\01.数据资料\02.聊城年鉴数据 ...
- Go 汇编入门
https://golang.org/doc/asm https://github.com/teh-cmc/go-internals/tree/master/chapter1_assembly_pri ...
- 解决Invalid Plugin needs a valid package.json
首先.npm install -g plugman 然后,plugman create --name [插件名字] --plugin_id [插件id] 这样会生成一个除了pa ...
- 转 oracle 正则表达式和查询最大文件号 SQL
###sample 1 https://www.cnblogs.com/lxl57610/p/8227599.html Oracle使用正则表达式离不开这4个函数: 1.regexp_like 2.r ...
- php对数组遍历的两种方式示例
在对 php 数组遍历时,一般经常使用 foreach 来遍历,很少用 while 来遍历,在下面的代码中作一个对比. <?php $content = ["ID" => ...