美文网首页
java23种设计模式-行为型模式之观察者模式

java23种设计模式-行为型模式之观察者模式

作者: 薛之谦chj | 来源:发表于2020-04-18 16:42 被阅读0次

    作者 薛之谦chj 转载请注明出处

    我的知乎:https://zhuanlan.zhihu.com/c_1229107265379897344


    内容简介:

    观察者模式(Observer Pattern),又叫 发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式 或 从属者(Dependents)模式。

    观察者模式 是对象的行为模式,定义了一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听,使得每当主题对象状态变化时,所有依赖于它的对象都会得到通知并被自动更新。

    观察者模式 核心:松耦合观察者与被观察者,以类似于消息/广播发送的机制联动两者,使被观察者的变动能通知到感兴趣的观察者们,从而做出相应的响应。

    主要解决:

    当完成一个操作具有固定的流程时,由抽象固定流程步骤,具体步骤交给子类进行具体实现(固定的流程,不同的实现)。

    具体实现:

    观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。先来看看关系图:

    我解释下这些类的作用:MySubject类就是我们的主对象,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通知在列表内存在的对象。我们看实现代码:

    一个Observer接口:

    两个实现类:

    Subject接口及实现类:

    测试类:

    输出:

    update self!

    observer1 has received!

    observer2 has received!

    优缺点:

    优点

    封装不变,扩展可变:父类封装了具体流程以及实现部分不变行为,其它可变行为交由子类进行具体实现;

    流程由父类控制,子类进行实现:框架流程由父类限定,子类无法更改;子类可以针对流程某些步骤进行具体实现;

    缺点

    抽象规定了行为,具体负责实现,与通常事物的行为相反,会带来理解上的困难(通俗地说,“父类调用了子类方法”);

    使用场景

    多个子类有公有的方法,并且逻辑基本相同时;

    重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现;

    重构时,模板方法模式 是一个经常使用的模式,把相同的代码抽取到父类,然后通过钩子函数约束其行为;

    相关文章

      网友评论

          本文标题:java23种设计模式-行为型模式之观察者模式

          本文链接:https://www.haomeiwen.com/subject/xjmjvhtx.html