一.概念
观察者模式:定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
二.设计原则
4.为了交互对象之间的松耦合设计而努力。
三.举例子
现在要做一个天气温度显示,每当温度改变的时候,就把最新的温度发送到设备上显示出来。也就是说温度这个对象必须通知显示温度的设备,但他不知道有多少设备。然而也不能假定这些设备是哪些。。所以可以来使用观察者模式来设计。可以分析出 天气温度是被监听的对象,设备都是监听的对象。。。
import java.util.Observable;
//天气温度对象,继承Observable对象,
public class WeatherData extends Observable {
private int tmp;//温度
public void proceedChanged() {
setChanged();
notifyObservers(); //采用观察者自己“拉”的模式
}
public void changeTmp(int t) {
this.tmp = t;
proceedChanged();
}
public int getTmp() {
return tmp;
}
}
在设计监听者时,为了更好扩展,设置了个温度显示接口。
import java.util.Observer;
public interface Display extends Observer {
public void display();
}
import java.util.Observable;
//PC端监听者
public class PCDisplay implements Display {
private Observable observable;
private WeatherData weatherData;
public PCDisplay(Observable observable) {
this.observable = observable;
this.observable.addObserver(this);//增加PC端监听者
}
@Override
public void display() {
System.out.println("PC端监听到现在温度是"+weatherData.getTmp());
}
@Override
public void update(Observable o, Object arg) {
if(o instanceof WeatherData) {
this.weatherData = (WeatherData) o;
display();
}
}
}
import java.util.Observable;
//Phone端监听者
public class PhoneDisplay implements Display {
private Observable observable;
private WeatherData weatherData;
public PhoneDisplay(Observable observable) {
this.observable = observable;
this.observable.addObserver(this);//增加Phone端监听者
}
@Override
public void display() {
System.out.println("Phone端监听到现在的温度是" + weatherData.getTmp());
}
@Override
public void update(Observable o, Object arg) {
if(o instanceof WeatherData) {
this.weatherData = (WeatherData) o;
display();
}
}
}
然后写个测试来运行一下吧。。。
public class Test {
public static void main(String[] args) {
WeatherData weather = new WeatherData();
PhoneDisplay phoneDisplay = new PhoneDisplay(weather);//设置手机端监听天气
PCDisplay pcDisplay = new PCDisplay(weather);//设置PC端监听天气
weather.changeTmp(31);
weather.changeTmp(28);
weather.changeTmp(22);
}
}
运行结果:
四.理解
当一个对象更新的时候,需要时时的告诉别的对象更新,或者要同时更新别的对象的时,且这两者的耦合性不能太高,那就用观察者模式。两个对象的交互性还是存在的,但是耦合性却已大大减小。
更多参考: