模式定义:简单来讲,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监控一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的所有观察者对象,使这些观察者对象能够更新自身。
模式中涉及的四个角色:
1、 Subject主题角色(被观察的对象接口)
1.1被观察者的统一接口;
1.2每个Subject可以有多个Observer对象的引用
采用Web商城来举例,比如我本人喜欢关注macbook啊,书籍啊,美食啊等商品。目前一直想买一个macbook,可是价格一直居高不下,那我只好等降价便宜了再去购买,没钱是硬伤。商城提供’降价后通知’功能,那么将我所关注的这些产品编写为抽象类,提供添加、删除、通知观察者等方法。比如目前有9个人关注了同一款macbook,然后当我点击’降价后通知’时,实际上就将我本人添加到了观察者列表中;删除同理。等了好久终于降价了,那么会将macbook降价的消息通过短信或者电子邮件的方法进行通知。
2、 ConcreteSubject(具体被观察对象)
2.1 维护队所有具体观察者的引用列表;
2.2 状态发生变化时会发送通知给所有注册的观察者。
该角色就好比上面举例中的macbook,引用列表就是所有关注该macbook的对象(人)的引用。
3、 Observer(观察者接口)
3.1 规定观察者的统一接口;
3.2 定义一个update方法。
此角色为所有的对象(人)的抽象接口,update方法在主题状态发生改变时调用。
4、 ConcreteObserver(具体观察者角色)
4.1 实现Observer接口。
在jdk中体现可以在java.util包下Observable类(被观察者)和Observer接口(观察者)查看源码。
观察者模式的应用场景:
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。