JAVA设计模式-09-观察者模式
参考:http://blog.****.net/pengjunlee/article/details/51707104
一、什么是观察者模式
观察者(Observer)模式是行为模式之一,它的作用是当一个被观察对象的状态发生变化时,能够自动通知相关的观察者对象,自动更新观察者对象中被观察对象的状态。它提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
二、观察者模式的典型应用
观察者(Observer)模式多被应用于以下场景:- 侦听事件驱动程序设计中的外部事件- 侦听/监视某个对象的状态变化- 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者


观察者模式中的角色及其职责如下:
抽象被观察者(Subject)角色:被观察对象的抽象类,为所有具体被观察者角色提供了一个统一接口,主要包括添加、删除、通知观察者对象方法,其内包含一个用以储存所有观察者对象的容器(Collection),当被观察者的状态发生变化时,需要通知容器中所有观察者对象,并维护(添加,删除,通知)观察者对象列表。
具体被观察者(ConcreteSubject)角色:被观察者的具体实现,包含一些基本的属性状态及其他操作,当具体被观察者的状态发生变化时,会给注册的所有观察者对象发送通知,以提示观察者对象们对其内被观察对象的状态进行更新。
抽象观察者(Observer)角色:这是一个抽象角色,通常被定义为一个接口,声明所有的具体观察者需实现的方法,当收到被观察对象状态发生变化的通知时更新自己。
具体观察者(ConcreteObserver)角色:观察者的具体实现,得到通知后将对内部被观察对象的状态进行更新,并完成一些具体的业务逻辑处理。
观察者模式结构示意源代码如下:
抽象被观察者(Subject)角色
具体被观察者(ConcreteSubject)角色
抽象观察者(Observer)角色
具体观察者(ConcreteObserver)角色
编写一个客户端来测试一番。
运行程序打印结果如下:
在JAVA语言的java.util库里面有一个Observable类和一个Observer接口,通过两者配合使用可以实现观察者模式。Observable类:Observable中文意思“可以被观察的”,即Observable类是可以被观察的,想要实现观察者模式只需将你想要被观察的类继承自Observable类即可。一个 Observable对象可以有一个或多个观察者,观察者可以是实现了Observer接口的任意对象。一个Observable对象状态改变后,会调用notifyObservers()方法来通知观察者。以下是Observable类提供的一些常用方法:Observer接口:Observer接口只包含一个update()方法,该方法仅接受两个参数:继承自Observable类的被观察对象和传递给notifyObservers() 方法的参数。当Observable(被观察者)对象状态发生改变时将通过notifyObservers()方法向所有的Observer(观察者)发送更新通知,Observer(观察者)对象在收到通知后即调用此方法完成状态更新。接下来我们举个简单的例子来演示一下如何使用Observable类和Observer接口实现观察者模式,去年2015年是牛市,炒股的基本都发家了,在此我们以炒股为例。在炒股这个例子中,不用我说,相信你也想的到:股票Stock就是我们的被观察者。我们这些只有韭菜命的股民自然就是观察者了。在客户端里面测试一下。运行程序打印结果如下:
观察者Observer模式解决了对象之间一对多的复杂依赖关系问题,并使得程序易于维护与扩展。