观察者模式16
一、定义
观察者模式又称订阅发布模式。它定义了一种一对多的依赖关系,即一个类向多个类发送消息。多个观察者对象同时观察一个主题对象。当主题对象状态发生变化的时候,主题对象会向所有观察者对象发送消息,使他们更新自己。
此模式应用极其广泛,在Java语言中的典型应用就是监听器。在JS语言中的典型应用是“事件”,比如onclick事件,立即调用相关的function。此模式务必要烂熟于心。
推荐文章:
二、相关角色
角色:
Subject:主题角色,或者说是抽象被观察者角色。它定义增加、删除、通知观察者的抽象方法。(定义为接口或者抽象类)
ConcreteSubject:具体的被观察者对象。内部维护一个观察者集合,并实现主题角色的增加、删除、通知观察者等方法。
Observer:抽象观察者。我们可以理解为接收消息的人。它定义一个更新方法,用于接收主题角色发送过来的消息。
ConcreteObserver:具体的观察者。具体的接收消息的人,更新方法一般接收主题角色引用。
三、优缺点
优点:
1.降低耦合。主题对象与观察者之间的依赖关系都依赖于抽象,不依赖于具体实现,耦合程度很低。主题对象不知道观察者的具体实现,而观察者只需被动的接收消息,双方的耦合程度非常的低。
2.观察者模式支持广播通讯,它建立了一套触发机制。主题角色会向所有的登记过的观察者发出通知。
缺点:
1.卡顿。如果一个观察者在接收消息后卡顿,剩下的观察者很可能收不到消息。
2.开发代码和调试会比较复杂。当系统中有一个被观察者,多个观察者时,开发代码和调试会比较繁琐复杂。
四、心法
观察者设计模式非常像JavaEE里面的监听器。当一个主题对象,比如session对象调用某个方法的时候,它先判断本对象持有的监听器对象是否为null。如果不是空,那么就调用监听器的相关方法(在web.xml中的<listener>标签为session注入监听器对象)。根据实际经验,WEB环境中发送给监听器的对象一般是一个以Event为结尾的事件对象。因此,我们可以受到启发,主题对象发送的消息可以被封装,自定义一个新的类用于封装发送的消息。
此模式一般用于事件处理系统。在JS中的事件,就是以此模式作为基石。onclick点击以后,立即执行相关的function。
因此,如果有向特定的人或系统及时发送消息这样的需求的时候,说的专业一点是:消息交换场景,考虑使用观察者设计模式。
简单应用:主题角色发送消息,希望所有特定的人都收到。也就是说,如果有需求是向特定的人发送消息,比如向不及格的同学发送短信,补考及格的同学可以从名单中删除。这就像推送广告一样。当然,如果你用过JIRA,就是那个改BUG的系统,你就是那个“观察者”,JIRA系统就是“主体对象”。
分割线--------------------------------------------------------------------------------------------
本篇博客篇幅很短,却花了我三个早上,前天搜集信息,学习其它博客中的知识。昨天继续搜集知识并完成了初稿,相关知识写在了txt文件中,因为快到上班时间,没来得及写。今天起了一个大早来完成观察者设计模式。有趣的是,昨天在下班的时候,我好奇的走到了一个同事旁边围观。当时围观吃瓜群众很多,不乏另外项目组的大佬。它们好像在讨论关于JS的问题。讨论到触发事件机制,什么onclick啊,onchange,双击事件啊,我一想,这不就是这几天研究的观察者设计模式的应用吗。我小声的说了一句:input标签可以看成一个对象,事件可以看成监听器对象。旁边的大佬说:“对的,触发机制原理就是观察者设计模式,在安卓中有着广泛的应用”。当时我就开心了,吃饭的时候提醒自己:你刚觉得有用的东西,别人早掌握啦,突然感觉学习设计模式很有动力。
分割线--------------------------------------------------------------------------------------------
下一篇:责任链设计模式17