培 网站建设方案 doc,物联卡官方免费申请入口,广州做网站公司排名,怎样为网站设计关键词概念
观察者模式#xff0c;原理很简单#xff0c;把A类的子类分别注入到B类中#xff0c;通过用B类调用方法#xff0c;循环调用A类的方法#xff0c;就是所谓观察者模式
伪代码如下#xff0c;最快的速度理解观察者模式#xff1a;
接口 A{// 观察者接口notify();
…概念
观察者模式原理很简单把A类的子类分别注入到B类中通过用B类调用方法循环调用A类的方法就是所谓观察者模式
伪代码如下最快的速度理解观察者模式
接口 A{// 观察者接口notify();
}
Class A1 extend A{// 等待被调的接口notify(){// A1类特有的实现println(A1被通知);}
}
Class A2 extend A{notify(){println(A2被通知);}
}
Class B{ListA alist;addA(A a){//将观察者注入到B中alist.add(a);}void notify(){for(A a : alist){// 循环通知每一个A的实现对象a.notify();}}
}
Class Test{main方法(){// 定义通知者BB b new B();// 将两个观察者A1,A2注册到B中b.addA(new A1());b.addA(new A2());// 当B发出通知后就会循环调用那些曾经在自己这里注册过的观察者b.notify();}
}观察者使用场景
上面的伪代码是最简单的观察者模式的原型。 观察者模式一般用于一个变化B的notify方法要引起多个变化A的notify方法的场景。比如我执行完一个操作后需要同时执行好几个方法。
举个例子消息通知
当系统生成一条消息后需要同时发送系统消息邮件消息短信消息甚至以后还会有其他类型的消息。 那就可以搞个消息的父类A定义好发送接口notify。 后面每种消息都是A的子类然后有着自己的发消息的不同实现。 然后搞个发消息的类B提前将A的这些子类注册给B当系统产生消息的时候只需要调用B的发送就可以将消息发给各个地方了。
再举个例子地主剥削
地主就是那个通知者 所有长工都是观察者 每个长工都要观察地主的命令。比如地主说打扫卫生然后在地主那里注册的所有长工都开始打扫卫生。如果新来了长工那就在地主那里注册下下次地主再发命令新来的长工也就和之前的长工一样了。
观察者的优缺点
优点解耦了观察者可以很容易的新增多个观察者。 缺点观察者和通知者耦合就是上面伪代码中A和B是耦合的。
为了解决这个缺点于是有了观察者模式的升级版发布订阅模式
发布订阅模式
发布订阅模式一听都比较熟悉因为我们用的mq就是基于发布订阅模式 发布订阅模式就是观察者模式的增强版。 哪里增强了呢我们知道观察者模式中观察者和通知者是耦合的是不能随意更换的。那发布订阅模式就是解了这种耦合。 将以前的通知者叫发布者 将以前的观察者叫订阅者 然后发布者和订阅者中间有个第三方记录发布者和订阅者的关系即谁订阅了谁 那么从此发布者和调用者就不用互相耦合了。
除了mq简单的还可以研究下google的eventbus可以参考我之前的一篇文章有现成的能运行的例子可以去感受一下。 spring boot 整合 谷歌guava的EventBus 实现单机版的消息发布订阅