要点:

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观察者模式的更多相关文章

  1. Matlab 绘制三维立体图(以地质异常体为例)

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  2. Matlab slice方法和包络法绘制三维立体图

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  3. Matlab 高斯_拉普拉斯滤波器处理医学图像

    前言:本程序是我去年实现论文算法时所做.主要功能为标记切割肝脏区域.时间有点久,很多细节已经模糊加上代码做了很多注释,因此在博客中不再详述. NOTE: 程序分几大段功能模块,仔细阅读,对解决医学图像 ...

  4. 23种设计模式--观察者模式-Observer Pattern

    一.观察者模式的介绍      观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...

  5. 谈谈JS的观察者模式(自定义事件)

    呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...

  6. MATLAB中绘制质点轨迹动图并保存成GIF

    工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...

  7. ObserverPattern(观察者模式)

    import java.util.ArrayList; import java.util.List; /** * 观察者模式 * @author TMAC-J * 牵一发而动全身来形容观察者模式在合适 ...

  8. java观察者模式

      像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...

  9. linux下配置matlab运行环境(MCR)

    在安装好的matlab下有MCR(MatlabCompilerRuntime)在matlab2011/toolbox/compiler/deploy/glnxa64下找到MCRInstaller.zi ...

随机推荐

  1. js - true和false

    JavaScript的true和false什么时候会出现,如何优雅的写判断条件? 以下条件为false,也可称为“falsy” - > 虚值 if (false) if (null) if (u ...

  2. centos上传命令

    首先安装lrzsz # yum -y install lrzsz 1.上传文件,执行命令rz,会跳出文件选择窗口,选择好文件,点击确认即可. # rz 运行rz命令后弹出选择文件窗口,找到要上传的文件 ...

  3. RK3288板子刷linux-ubuntu16固件

    Firefly-RK3288 是一个高性能平台,拥有强大的多线程运算能力.图形处理能力以及硬件解码 能力,而且支 持 Android和Ubuntu双系统; 下面我们使用RK3288的板子刷linux ...

  4. Go安装配置和《菜鸟教程之Go语言教程》学习笔记

    Go 语言是一种让代码分享更容易的编程语言 菜鸟教程-Go语言教程(这个教程过于基础,体现不了Go的特性和强大.) 下载/安装Go语言 https://golang.org/dl/ Mac OS X ...

  5. pandas.DataFrame.sample随机抽样

    https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2&shareId=400000000398 ...

  6. Docker学习大纲

    Docker学习大纲:https://www.cnblogs.com/CloudMan6/p/7637361.html

  7. 虚拟机 /dev/mapper/centos-root 动态扩容

    [root@bogon ~]# df -h Filesystem Size Used Avail Use% Mounted on .2G .2G 51M % / devtmpfs 908M 908M ...

  8. python开发笔记-str转字典

    后台接收到post请求数据格式为json格式的字符串,不能直接用字典的get方法 909090909090909090909090909090909 Internal Server Error: /g ...

  9. jzy3D从入门到弃坑_4尝试使用jzy3D1.0画图失败

    jzy3D从入门到弃坑_4 尝试使用jzy3D1.0画图失败 觉得有用的话,欢迎一起讨论相互学习~Follow Me 记录一下使用jzy3D1.0失败 究其原因在于 本人才疏学浅,对于JAVA ope ...

  10. Django的分页器 paginator

    导入 from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger Page对象 Paginator.page()将返回 ...