的观察者模式本文转载自微信公众号《狼王编程》,作者狼王。转载本文请联系狼王编程公众号。大家好,我是狼王,一个爱玩的程序员。让我们认识一下观察者模式1.概述观察者模式是一种行为设计模式,它允许您定义一种订阅机制,当一个对象事件发生时,可以使用该机制通知多个其他“观察”该对象的对象。2、适用场景1)当一个对象的状态改变需要改变其他对象,或者实际对象事先未知或动态变化时,可以使用观察者模式。2)当应用程序中的某些对象必须观察其他对象时,使用此模式。但仅限于有限的时间或在某些情况下。订户可以随时加入或离开列表。3、示例有以下场景:有社区,需要进行核酸检测。假设每个人都通过关注公众号获得核酸检测结果。发布者接口:/***发布接口*/publicinterfaceIPublisher{/***发布事件*@paramevent*/voidpublish(IEventevent);}订阅者接口:/***通用订阅接口*/publicinterfaceISubscriber{/***查看结果*/voidlook();}事件接口:/***通用事件接口*/publicinterfaceIEvent{/***打印事件信息*/voidprint();}消息发送器/***消息发送器*/publicclassPublisherimplementsIPublisher{privateIEventevent;privateListsubscribers;publicPublisher(IEventevent,Listsubscribers){this.event=event;this.subscribers=subscribers;}/***发布消息*@paramevent*/@Overridepublicvoidpublish(IEventevent){event.print();}publicIEventgetEvent(){returnevent;}publicvoidsetEvent(IEventevent){this.event=event;}publicListgetSubscribers(){returnsubscribers;}publicvoidsetSubscribers(Listsubscribers){this.subscribers=subscribers;}}事件:/***检查事件*/publicclassCheckEventimplementsIEvent{privateStringname;privateStringresult;privateISubscribersubscriber;publicISubscribergetSubscriber(){returnsubscriber;}publicvoidsetSubscriberer(ISubscribersubscriber){this.subscriber=subscriber;}publicCheckEvent(Stringname){this.name=name;}@Overridepublicvoidprint(){subscriber.look();System.out.println("事件名称:"+name);System.out.println("事件结果:"+result);}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetResult(){returnresult;}publicvoidsetResult(Stringresult){this.result=result;}}Subscriber:/***Subscriber*/publicclassUserimplementsISubscriber{privateStringname;publicUser(Stringname){this.name=name;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}@Overridepublicvoidlook(){System.out.println("Detectionname:"+name);}}Client:/***Testclass*/publicclassTestDemo{publicstaticvoidmain(String[]args){//定义两个结果String[]doc={"Negative","Positive"};//初始化检测事件CheckEventcheck=newCheckEvent("核酸检测");//初始化消息发布者Publisherpublisher=newPublisher(check,newArrayList<>());//实例化待检测用户Listusers=newArrayList<>();for(inti=0;i<10;i++){//初始化用户Useruser=newUser("狼王"+i);users.add(user);}//用户订阅事件发布者。setSubscribers(users);intindex;//发布检测结果for(inti=0;i<10;i++){System.out.println("----------------");//随机检测结果index=(int)(Math.random()*doc.length);check.setSubscriber(users.get(i));check.setResult(doc[index]);//发布publisher.publish(check);}}}结果:----------------检测名称:狼王0事件名称:核酸检测事件结果:阴性---------------测试名称:狼王1事件名称:核酸测试事件结果:阴性----------------测试名称:狼王2事件名称:核酸测试事件结果:Positive---------------测试名称:狼王3事件名称:核酸测试事件结果:阴性--------------测试名称:狼王4事件名称:核酸检测事件结果:阳性--------------检测名称:狼王5事件名称:核酸检测事件结果:阳性-----------------测试名称:狼王6事件名称:核酸测试事件结果:阳性----------------测试名称:狼王7事件名称:核酸测试事件结果:阴性-------------测试名称:狼王8事件名称:核酸测试事件结果:阴性--------------测试名称:狼王9事件名称:核酸检测事件结果:阴性4.分析代码依赖如下图:分别定义了三个接口:event接口,消息发布者接口,消息订阅者接口。每个接口都有其对应的实现。这种设计有利于后续的扩展,可以在不同的事件和不同的订阅者和消息发布者中进行扩展,而不影响其他人。5.总结优点:1)开闭原则2)业务代码解耦,具体的消息订阅者和发布者没有直接关联。缺点:1)多个消费者存在时,可能无法控制顺序,时间可能较长。好吧。今天就到这里吧,我会继续分享我的所学所想,希望我们一起走在成功的路上!