HeadFirst 设计模式笔记(二)—— observer

观察者模式:定义了对象间的一对多依赖,当一个对象有新的消息,所有与之关联的对象都将得到通知。这是一个非常常用的模式,它能使我们的对象知悉现状。就像报社与订报人之间的关系:
  1. 用户可以随时决定订阅或取消订阅。
  2. 一旦用户订阅了报纸,那么新一期的报纸只要一出版就会被送上门。

为了展示这个模式的应用,我们假设有两个类:Observer和Suject(被观察者,主题)。


Subject中:
  • 需要维护一个列表,由所有的Observer组成。
  • 实现addObserver/removeObserver实现观察者的注册和注销
  • 实现notifyObserver方法,每当出现新的消息,我们遍历已注册的Observer列表,并逐一通知它们(调用他们的update方法)
Observer中:
  • 为了把自己注册到感兴趣的Subject上,需要调用Subject的addObserver方法,为此可以将Subject作为构造参数,也可以使用其他方法。
  • 实现update方法,供Subject调用,即在有新消息时作何处理。
  • 不再对此Subject感兴趣时可以把自己从Subject注销,使用Subject的removeObserver方法。

Java中对观察者模式提供了内置支持:Obserser类可以实现接口java.util.Observer; Subject类可以扩展java.util.Observable类。


注意:java api中提供的这种方式存在一些问题:
  • Observable是一个类而不是接口,这使得我们不得不通过继承它来使用,而java是不支持多继承的,当我们需要另一个基类时这有可能带来不便。
  • 根据java中的实现,列表中的observer对象被通知的顺序是不确定的,我们不能依赖这一顺序。

总之,有必要时请自行实现这一模式,它并不太复杂!


PS:通知的传递方式有两种:“推”和“拉”。根据update方法的参数,我们可以选择把suject作为参数传给observer,由它自行获取感兴趣的信息;或者把subject想提供的信息直接传给observer。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值