当前位置: 首页 > 科技观察

本文带你吃透发布订阅设计

时间:2023-03-20 21:47:58 科技观察

本文转载自微信公众号《Java极客技术》,作者鸭血范。转载本文请联系Java极客技术公众号。1.介绍一下我们常说的发布-订阅设计模式,也就是观察者模式,也就是事件监听机制。观察者模式订阅一对多的依赖关系,允许多个观察者对象同时监视某个主题对象,当主题对象发生变化时,它会通知所有观察者对象,让它们自动更新自己!一个软件系统要求当一个对象发生变化时,其他一些对象也做出相应的变化,可以做到这一点的设计方案有很多,但观察者模式是满足这一要求的各种设计方案中最主要的。总体来说,观察者模式涉及的角色有:抽象主题角色:抽象主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意数量的观察者。抽象主题提供了一个可以添加和删除观察者对象的接口;具体主题角色:将相关状态存储在具体的观察者对象中,当具体主题的内部状态发生变化时,向所有注册的观察者发送通知;abstractobserver作用:为所有特定的观察者提供一个接口,当它们被主体通知时更新自己;具体观察者作用:存储与主体状态相关的状态。具体的观察者角色实现了抽象观察者角色所需要的更新接口,从而协调自己的状态和主体的状态。下面直接说案例吧!2.抽象主体角色示例,包括添加观察者,删除观察者和通知观察者的功能如下:publicabstractclassAbstractSubject{/**用于保存注册的观察者对象*/privateListlist=newArrayList();/***注册观察者对象*/publicvoidadd(Observerobserver){list.add(observer);System.out.println("addanobserver");}/***删除观察者对象*@paramobserver*/publicvoidremove(Observerobserver){list.remove(观察者);System.out.println("deleteanobserver");}/***通知所有注册的观察者对象*@paramstate*/publicvoidnotifyObservers(Stringstate){for(inti=0;iObservableobject's*notifyObserversmethodtohavealltheobject's*observersnotifiedofthechange.**@paramotheobservableobject.*@paramarganargumentpassedtothenotifyObservers*method.*/voidupdate(Observableo,Objectarg);}这是观察者的接口,定义的观察者只需要实现这个接口即可。update()方法,当被观察对象的状态发生变化时,被观察对象的notifyObservers()方法会调用该方法,内容如下:(){obs=newVector();}/***将一个观察者添加到该对象的观察者集合中,前提是*该集合中已经有不同的观察者。*通知将被传递给多个*观察者的顺序未指定。请参阅类注释。**@paramoanobserver被添加。*@throwsNullPointerException如果参数为空。*/publicsynchronizedvoidaddObserverthrownewNullPointerException();if(!obs.contains(o)){obs.addElement(o);}}...}这是被观察对象的父类,也就是主体对象。这是一个基于Vector实现的线程安全类。创建具有以下内容的观察者:importjava.util.Observable;importjava.util.Observer;publicclassWatchedimplementsObserver{@Overridepublicvoidupdate(Observableo,Objectarg){System.out.println("Observer,receivedstatus:"+arg);}}Create具有以下内容的主题:importjava.util.Observable;publicclassSubjectextendsObservable{privateStringdata;publicvoidsetData(StringnewData){System.out.println("Themestatus:"+newData);data=newData;setChanged();notifyObservers(data);}}写一个主函数调用,内容如下:publicclassWatchedClient{publicstaticvoidmain(String[]args){//创建一个观察者对象/修改subjectstatussubject.setData("helloworld");}}运行结果,内容如下:subjectstatus:helloworldobserver,receivedstatus:helloworldseewhensubjectobjectchanges,observerobjectstate相应改变.4.总结我认为引入设计模式最重要的作用有两点:去重代码,让代码更清晰,更易读,更容易扩展和解耦,让代码更易于维护,尽量少改动代码可能的。这两个都是使用观察者模式很好地完成的。添加观察者,直接新建观察者注册到subject对象,然后删除观察者,调用subject对象的方法删除,剩下的不用管。当主体对象的状态发生变化时,内部会自动通知每个观察者。是不是很方便?观察者模式的主要应用场景是:一个对象状态的更新需要其他对象同步更新。对象只需要将自己的更新通知给其他对象不需要知道其他对象的详细信息,比如消息推送