Java观察者模式实例分析
这篇文章主要讲解了“Java观察者模式实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java观察者模式实例分析”吧!
观察者模式所做的工作其实就是在解耦,让耦合的双方都依赖于抽象而不是具体,从而使得各自的变化都不会影响另一边的变化。
当一个对象的改变需要改变其他对象的时候,而且它不知道具体有多少对象有待改变的时候,应该考虑使用观察者模式。
一个抽象模型有两方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使得他们各自独立地改变和复用。
举例publicinterfaceISubject{voidNotify();stringSubjectState{get;set;}}publicclassBoss:ISubject{privatereadonlyIList_observers=newList();publicvoidAttach(Observerobserver){_observers.Add(observer);}publicvoidDetach(Observerobserver){_observers.Remove(observer);}publicvoidNotify(){foreach(varobserverin_observers){observer.Update();}}publicstringSubjectState{get;set;}}publicabstractclassObserver{protectedstringName;protectedISubjectSubject;protectedObserver(stringname,ISubjectsubject){Name=name;Subject=subject;}publicabstractvoidUpdate();}publicclassStockObserver:Observer{publicStockObserver(stringname,ISubjectsubject):base(name,subject){}publicoverridevoidUpdate(){Console.WriteLine($"{Name}{Subject.SubjectState}关闭股票行情,继续工作");}}publicclassNBAObserver:Observer{publicNBAObserver(stringname,ISubjectsubject):base(name,subject){}publicoverridevoidUpdate(){Console.WriteLine($"{Name}{Subject.SubjectState}关闭NBA直播,继续工作");}}varboss=newBoss();varstockObserver=newStockObserver("魏关姹",boss);varnbaObserver=newNBAObserver("易管查",boss);boss.Attach(stockObserver);boss.Attach(nbaObserver);boss.Detach(stockObserver);boss.SubjectState="老板我胡汉三回来了";boss.Notify();
借助 event(委托) 我们可以实现可以灵活的观察者模式,我们定义了一个新老板来演示事件的方式,来看下面的示例:
publicclassNewBoss:ISubject{publiceventActionUpdate;publicvoidNotify(){Update?.Invoke();}publicstringSubjectState{get;set;}}publicclassGamePlayerObserver{privatereadonlystring_name;privatereadonlyISubject_subject;publicGamePlayerObserver(stringname,ISubjectsubject){_name=name;_subject=subject;}publicvoidCloseGame(){Console.WriteLine($"{_name}{_subject.SubjectState}关闭LOL游戏,继续工作");}}varnewBoss=newNewBoss();varstockObserver=newStockObserver("魏关姹",boss);varnbaObserver=newNBAObserver("易管查",boss);vargameObserver=newGamePlayerObserver("西门",newBoss);//注册通知事件newBoss.Update+=stockObserver.Update;newBoss.Update+=nbaObserver.Update;newBoss.Update+=gameObserver.CloseGame;newBoss.Update-=stockObserver.Update;newBoss.SubjectState="老板我胡汉三回来了";newBoss.Notify();
从上面这个示例可以看到,通过事件的方式,我们可以不要求显示继承于 Observer 这个抽象类,可以更加灵活,扩展性更强,这也是很多类库中会使用事件来扩展的重要原因
More设计模式要干的事情就是解耦。创建型模式是将创建和使用代码解耦,结构型模式是将不同功能代码解耦,行为型模式是将不同的行为代码解耦,具体到观察者模式,它是将观察者和被观察者代码解耦。
根据应用场景的不同,观察者模式会对应不同的代码实现方式:有同步阻塞的实现方式,也有异步非阻塞的实现方式;有进程内的实现方式,也有跨进程的实现方式。
在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。不过,在实际的项目开发中,这两种对象的称呼是比较灵活的,有各种不同的叫法,比如:Subject-Observer、Publisher-Subscriber、Producer-Consumer、EventEmitter-EventListener、Dispatcher-Listener。不管怎么称呼,只要应用场景符合刚刚给出的定义,都可以看作观察者模式。
EventBus(事件总线) 就是一个观察者模式的实际应用。
感谢各位的阅读,以上就是“Java观察者模式实例分析”的内容了,经过本文的学习后,相信大家对Java观察者模式实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。