观察者模式
观察者模式定义对象间的一对多的依赖关系,当一个对象(被观察者)的状态发生改变时, 所有依赖于它的对象(观察者)都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。
1. Observable和Observer对象是一对多的关系,也就是说一旦Observable对象状态变化,它就要负责通知所有和它有关系的Observer对象,然后做相应的改变.
1. Observable对象不会主动去通知各个具体的Observer对象其状态发生了变化,而是提供一个注册接口供Observer对象使用,任何一个Observer对象如果想要被通知,则可以使用这个接口来注册.
3. 在Observable中有一个集合和一个状态控制开关,所有注册了通知的Observer对象会被保存在这个集合中.这个控制开关就是用来控制Observable是否发生了变化,一旦发生了变化,就通知所有的Observer对象更新状态.
好了,废话不多说,直接上代码,首先抽象一个场景:一伙劫匪正在抢银行,劫匪老大安排2个小弟分别在前后门望风,有警察来了通知里面的人撤退。
观察者A:
public class ObserverA implements Observer {
@Override
public void update(Observable observable, Object data) {
System.out.println("ObserverA 说警察来了,快跑啊...");
}
}
观察者B:
public class ObserverB implements Observer {
@Override
public void update(Observable observable, Object data) {
System.out.println("ObserverB 说警察来了,快跑啊...");
}
}
被观察者:
public class PoliceMan extends Observable {
/**
* 警察巡逻
*/
public void patrol(){
if(true){
super.setChanged();
}
notifyObservers("我正在巡逻...");
}
}
方法的实现,这里时基于android的,java直接写一个测试类在mian方法里面实现:
mbtnObserver.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//初始化被观察对象
PoliceMan policeMan = new PoliceMan();
//初始化2个观察者
ObserverA observerA = new ObserverA();
ObserverB observerB = new ObserverB();
//把2个观察者添加到被观察者列表中
policeMan.addObserver(observerA);
policeMan.addObserver(observerB);
//被观察这开始工作
policeMan.patrol();
}
});
输出:
劫匪跑了......