观察者模式使用场景
业务场景中,经常会有这样一种情况,某个对象状态改变时,另外一组(与之相关的)对象也要发生改变。观察者模式就是用来解决这种问题的。
JDK对观察者模式的支持
由于观察者模式是如此常用,以至于JDK直接提供类支持,它们是在java.util包下的Observable和Observer。
具体应用
Observable类表示被观察的对象,它负责记住当自己发生变化时需要通知哪些类。当它状态发生变化时,它就通知那些观察者类,“OK,你们(指观察者)可以根据需要更新你们自己了”。Observable通过notifyObservers()方法通知列表上的每个观察者。
Observer表示观察者,它只是一个接口,这个接口只有一个方法update()。当被观察者通知所有观察者更新的时候,它就会调用update()方法更新自己。
观察者模式的实质
观察者模式是典型的将变化的东西从不变的东西中分离出来的设计模式。实际上,观察者模式应用的场景中,真正变化的有两样东西:观察者的数量和它们更新自己的方式。观察者模式使得你在不必改动其他代码的情况下,只针对这两种变化更改代码。
实际场景举例
在中国古代,对敌人进行监视是很常见的,监视者俗称“探子”,这里就这个场景进行模拟。
/**
* Spy类,即“探子”,在这里是观察者,它只要发现被观察者状态发生变化,就会向主人汇报
*/
class Spy implements Observer{
// 探子名
private String name;
public Spy(String name){
this.name = name;
}
public void update(Observable o, Object arg){
System.out.println(name + "报告主人,敌方正在" + arg);
}
}
/**
* 敌人类,被观察者,当它状态改变时,会通知观察者更新自己的状态
*/
class Enemy extends Observable{
// 敌人的动向
private String action = "";
// 敌人动向改变
public void changeAction(String action){
this.action = action;
notifyObservers(action);
}
@Override
public void notifyObservers(Object arg){
// 状态标志位,表示状态更新
setChanged();
super.notifyObservers(arg);
}
}
public class Client{
public static void main(String[] args){
Enemy enemy = new Enemy();
Spy spy1 = new Spy("一号探子");
Spy spy2 = new Spy("二号探子");
Spy spy3 = new Spy("三号探子");
enemy.addObserver(spy1);
enemy.addObserver(spy2);
enemy.addObserver(spy3);
enemy.changeAction("急速行军");
enemy.changeAction("安营扎寨");
}
}
输出结果:
网友评论