mvc参数传值 应用面向对象编程SoC原则的典型示例(2)

电脑杂谈  发布时间:2018-02-05 18:03:21  来源:网络整理

图 9.11 观察者模式的实现结构

在如图 9.11 所示的观察者模式的中,观察者类(Observer)、观察对象类(Subject)、具体的观察者类(ConcreteObserver)和具体的观察对象类(ConcreteSubject)共同完成观察者模式的各项职责,使用“添加、通知和删除”的方法实现观察者模式。

Observer(观察者):Observer 角色负责接收来自 Subject 角色状态变化的通知,即Subject 调用每个 Observer 的 update 方法,发消息通知所有的 Observer,从而将 Subject 和Observer 解耦。因此,当对象间有数据依赖时,最好用观察者模式对它们解耦。

由于 Observer 角色是抽象的,虽然它声明了 update 方法,但不提供任何实现,该方法在子类中实现。

Subject(观察对象):Subject 角色表示观察对象,定义观察对象必须实现的职责:管理(添加或删除)观察者并通知观察者。从 Subject 指向 Observer 的箭头线表明 Subject包含了 Observer 类型的实例,箭头前面的实心圆圈表示多于一个实例。

当观察对象的状态变化时,由于它不知道该将消息发送给谁,因此 Subject 角色定义了一个可以存储 N 个观察者对象“列表”,以及添加(attach)、删除(detach)和通知(notify)观察者的抽象方法。

当观察对象决定通知它的所有观察者对象时,notify 遍历观察者对象“列表”,调用每个 Observer 的 update 方法,发消息通知所有的 Observer,告诉它们“我的状态改变了,请更新显示内容”。如果在 Subject 角色中注册了多个 Observer 角色,谁先注册就先调用谁的update 方法,不能改变调用顺序。

ConcreteObserver(具体的观察者):ConcreteObserver 角色表示具体的观察者,当它的方法被调用后,就会去获取具体的观察对象的最新状态。从 ConcreteObserver 指向ConcreteSubject 的箭头线表明 ConcreteObserver 包含了 ConcreteSubject 类型的实例,由于没有实心圆圈,则表示有且仅有一个实例。

ConcreteSubject (具体的观察对象):ConcreteSubject 角色表示具体的观察对象,其职责非常明确——谁能观察,谁不能观察。它不仅提供函数的实现,而且提供获取和管理它发布数据的方法。当自身的状态发生改变时,它会通知所有已经注册的 Observer 角色。mvc参数传值除了要支持 Subject 角色外,根据业务的不同,可能还需要提供诸如 getState()、setState()这样的函数,用于具体的观察者获取或设置相关的状态。

观察者模式中的 Subject 和 Observer 接口是为了处理 Subject 的变化而设计的,因此当对象之间有数据依赖时,最好用观察者模式对它们进行解耦。观察者模式的适用范围如下:

当一个抽象模型有两个方面时,如果其中一个方面依赖于另一个方面,则只要将这两者封装在独立的对象中,即可使它们各自独立地改变和复用。

当改变一个对象需要同时改变其它对象时,却不知道具体有多少个对象有待改变。

当一个对象必须通知其它对象时,而又无法预知其它对象是谁,而你不希望这些对象是紧耦合的。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-65228-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 杂技卡柏斯
      杂技卡柏斯

      果断把今天刚买的芝麻糊扔掉

    热点图片
    拼命载入中...