04 observer观察者模式(行为型)

版权声明:就是开个版权玩一下 https://blog.csdn.net/qq_41997479/article/details/86619089

04 observer(行为型)

    • 观察者模式:(也叫家属Dependents、观察-订阅者Publish-Subscribe、视图Model-View)
      • 定义对象间的一对多依赖,当一个对象状态改变时,其他对象会被通知到并自动更新自身状态。
      • 需要在不使类紧密耦合的情况下保持相关对象之间的一致性。
      • 主题知道他的观察者,当主题本身发生改变,他需要通知观察自己的观察者,自己改变了
      • 运用环境:
        • 当对一个对象的更改需要更改其他对象时,您不知道需要更改多少对象。
        • 当一个对象能够通知其他对象而不需要假设这些对象是谁时。换句话说,您不希望这些对象紧密耦合。
      • 满足的原则:
        • 满足开放封闭原则,
          • 增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便
        • 最小知识原则
          • 观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,无须了解其具体观察者。
        • 接口分离原则
          • 可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色

 

    • 观察者定义update方法
    • 优点:
        • 可以重用主题而不重用它们的观察者,反之亦然
        • 可以在不修改主题的情况下添加观察者
        • 所有subject只知道它的观察者名单
        • Subject不需要知道观察者的具体类,只需要知道每个观察者实现了update接口

 

    • 主体和观察者可以属于不同的抽象层
      • 观察者能在任何时候被添加或者删除
      • Subject向所有订阅的观察者发送通知
    • 缺点:
      • 不被期待的更新
        • 观察者对彼此的存在一无所知,他们可能对改变主题的代价视而不见
        • 观察者不知道彼此的存在,他们可能看不到改变话题的代价
        • 此外,依赖标准没有明确的或维护通常导致假(伪造的)更新,很难追踪。
      • 简单的更新协议没有提供关于主题中发生了什么变化的详细信息。观察者必须弄清楚是什么改变了他们自己,因此我们需要推断deduce出这些变化。
    • 什么时候用:
      • 当抽象有两个方面时,一个依赖于另一个。将这些方面封装在单独的对象中可以使您独立地更改和重用它们。
      • 当对一个对象的更改需要更改其他对象时,您不知道需要更改多少个对象。
      • 当一个对象能够通知其他对象而不需要假设这些对象是谁时。换句话说,您不希望这些对象紧密耦合。
    • 举例:java AWT /Swing Ecent Model
      • 基于观察者模式的Java GUI事件模型
      • //回去看一下arraylist,setchanged
      • java自带的Observer  Pattern模式的问题/特征:
        • 见代码包observer.baby.observer.builtin
        • 主题只能继承extends observable
    • Push vs Pull
      • Pull Model
        • Observer要自己找什么变了
      • Push Model
        • Subject负责安排的妥妥的
    • 结构:

 

 

猜你喜欢

转载自blog.csdn.net/qq_41997479/article/details/86619089
今日推荐