Matlab观察者模式
要点:
1、服务端(Subject)维护一个观察者的列表,以便能够向所有的观察者(Observer)推送信息
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。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();
更多精彩

