观察者模式的定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖都会收到通知并自动更新;
观察模式的设计原则:为了交互对象之间的松耦合而努力,观察者模式为什么能实现对象之间的松耦合,因为被观察者(或者叫主题Subject)Observable和观察者Observer之间是不直接进行交互的,改变被观察者和观察者任何一方的代码改变并不会影响另一方。
现实的类比:观察者模式也叫订阅者模式,相当于现实社会中的订报纸,只要你订阅了某份报纸,每天都能收到新发行的报纸,如果哪天你不需要订阅了直接取消订阅就可以了,java内置了观察者模式,下面我们以java内置的观察者模式举个简单的例子:
被观察者必须继承Observable类:
package observer;
import java.util.Observable;
/**
* Observable是java内置的主题(Subject),也是被观察者
* Observable帮助我们实现了注册观察者、注销观察者等
* 一些列基础操作
*
*
*/
public class ObserverImp extends Observable {
//被订阅的消息
private String message;
//订阅模式分为push(推)和pull(拉)两种方式,我们这里
//实现拉的方式,所以提供get方法
public String getMessage(){
return message;
}
public void setMessage(String message){
this.message = message;
}
//触发推送消息的操作,setChanged和notifyObservers
public void sendmsg(){
setChanged();
notifyObservers();
}
public static void main(String[] args) {
//生成一个被观察者
ObserverImp observerImp = new ObserverImp();
observerImp.setMessage("我是发给观察者的一条消息");
//生成一个观察者,并订阅被观察者
observerImp.addObserver(new Observers());
//被观察者发送一条状态消息时,观察者应该能收到该消息
observerImp.sendmsg();
}
}
观察者必须实现Observer接口:
package observer;
import java.util.Observable;
import java.util.Observer;
/**
* Observer是java内置的观察者,实现Observer接口并实现
* update方法就能实现消息的动态接收
*/
public class Observers implements Observer {
@Override
public void update(Observable o, Object arg) {
if(o instanceof ObserverImp){
System.out.println("观察这得到一个通知, 通知的消息=" + ((ObserverImp)o).getMessage());
}
}
}