java观察者模式与消息队列,jdk 观察者模式
目录
概念组成实现总结
概念
观察者模式又叫做发布-订阅模式,是对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
组成
抽象主题角色(主题)也叫抽象目标类,抽象主题知道自己的观察者有哪些,提供删除和新增观察者的方法以及通知观察者的抽象方法,由抽象类或接口实现
抽象观察者角色(观察家)
包含了一个更新的抽象方法,当收到具体主题的更新通知后调用,由抽象类或接口实现
具体主题角色(混凝土主体)
也叫具体目标类,实现抽象目标类的通知方法,当具体主题发生改变时通知所有订阅自己的观察者
具体观察者角色(混凝土观察家)
实现抽象观察者角色的抽象方法,收到主题更改通知后更改自身状态
实现
抽象观察者观察员接口包含一个观察者接收通知改变自身状态方法
公共接口观察者{//收到通知,改变自身状态void update();}具体观察者观察家一和观察家二
实现观察者接口中的更新方法
公共类观察者实现观察者{ @ Override public void update(){ system。出去。println(第一个观察者收到通知,状态更新了);} }公共类观察者二实现观察者{ @ Override public void update(){ system。出去。println(第二个观察者收到通知,状态更新了);} }主题接口
包含添加,删除,通知观察者方法,由抽象目标类实现,还有一个自身操作的方法,由具体目标类实现
公共接口主题{ //添加观察者无效添加(观察者观察者);//删除观察者无效删除(观察者观察者);//通知所有观察者void notify observer();//自身操作空的操作();}抽象目标类抽象主题
抽象类,因为观察者数量不固定,所以使用Vector动态数组存储观察者,实现科目接口中的添加、删除、通知观察者方法,operation方法由具体目标类实现
公共抽象类抽象主题实现Subject { vector观察者vector=new vector观察者();@覆盖公共void添加(观察者观察者){ vector.add(观察者);} @覆盖公共void remove(Observer观察者){ vector.remove(观察者);} @ Override public void notify Observer(){ for(Observer观察者:向量){观察者。update();} } }具体目标类我的主题
继承抽象主题类,实现操作方法,并在operation方法中调用notifyObservers方法以达到自身状态改变后通知观察者的效果
公共类我的主题扩展抽象主题{ @ Override public void operation(){ system。出去。println(具体目标状态改变);System.out.println(正在通知观察者。);通知观察者();System.out.println(通知完毕!);} }测试类测试
public class Test { public static void main(String[]args){ my subject my subject=new my subject();我的主题。add(新观察者一个());我的主题。add(新观察者二());我的主题。operation();}}
总结
观察者模式主要解决了什么问题在低耦合的条件下,一个对象状态发生改变,其他对象会收到通知
观察者模式什么时候使用
一个对象状态改变,所有有依赖关系的对象都会收到广播通知
观察者模式的优点
观察者和目标是抽象耦合的,低耦合,是一套触发机制
观察者模式的缺点
如果一个目标中有很多直接观察者和间接观察者,那么通知所有观察者就要花很多时间。如果观测者和被观测者之间存在循环依赖,可能会出现循环调用,导致系统崩溃。观察者无法知道目标状态如何变化,只能知道目标状态改变了观察者模式的注意事项.
JAVA中已经有观察者模式的支持类,可以直接使用避免循环调用如果顺序执行观察者的更新方法,一个观察者的错误会导致系统卡顿,一般是异步的。本文到此为止。希望能帮到你,也希望你能多关注更多的科普IT的内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。