使用java类库中的Observable类和Observer接口实现观察者模式会更加精简,Observable类定义了观察者关注的主题行为,我们只需要继承Observable类就可以达到复用的效果,不用自己定义抽象类或接口,Observable类中有三个方法需要我们了解,第一个是添加观察者的方法addObserver(Observer o),第二个标记我们继承类Observable的主题类对象为已改变的对象的
setChanged()方法,第三个是通知我们的观察者的方法
notifyObservers()。我们的观察者需要实现一个Observer接口,当观察者关注的主题状态发生改变的时候,就会通知我们的观察者,也就是调用观察者的
update(Observable o, Object arg)
方法。
简单案例如下:当我们公司的老板回来的时候,就会通知我们所有的工作人员下班,这里的老板就是通知者,工作人员就是我们的观察者。
第一步:创建通知者类。具有姓名属性和行为状态,继承类Observable,覆盖父类的notifyObservers()方法,在里面调用方法setChanged(),当调用notifyObservers()方法的时候,就会通知所有的观察者,即调用观察者的update()方法。
import java.util.Observable;
/**
* Observable是一个监听器,监听本类是否发生改变
* 当发生改变时会调用notifyObservers()方法
* 进而通知所有的观察者,可以调用方法addObserver(Observer o)
* 来添加需要通知的观察者,观察者有一个更新自己的方法
* update(Observable o, Object arg)
*/
public class President extends Observable {
private String name; //姓名
private String action; //状态
@Override
public void notifyObservers() {
setChanged(); //表面当前对象状态已经发生改变
super.notifyObservers();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
第二步:创建观察者类,实现Observer接口,实现其update()方法。
import java.util.Observable;
import java.util.Observer;
public class WorkObserver implements Observer {
private String name;
public WorkObserver (String name) {
this.name = name;
}
public void update(Observable o, Object arg) {
President president = null;
if (o instanceof President) {
president = (President)o;
}
System.out.println(president.getAction() + " " + this.name + ",辛苦了,下班了!");
}
}
第三步:测试类如下:
//测试
public class Test3 {
public static void main(String[] args) {
//通知者
President president = new President();
//观察者
WorkObserver work1 = new WorkObserver("小丽");
WorkObserver work2 = new WorkObserver("小王");
//添加需要通知的观察者
president.addObserver(work1);
president.addObserver(work2);
//通知者的状态发生改变
president.setAction("老板快回来了!");
//通知观察者
president.notifyObservers();
}
}
第四步:在实际开发中,我们需要通知的观察者可能之前就已经定义好了更新自己状态的方法,方法名可能不是update(),我们的观察者也可能是各种各样的,所定义的更新自己行为的方法名各部一样,而我们的通知类中的方法notifyObservers()只能调用观察者的update(),那么此时我们可以使用代理,观察者代码可以修改如下,进而实现功能,代码如下:
import java.util.Observable;
import java.util.Observer;
public class WorkObserver implements Observer {
private String name;
public WorkObserver (String name) {
this.name = name;
}
// public void update(Observable o, Object arg) {
// President president = null;
// if (o instanceof President) {
// president = (President)o;
// }
// System.out.println(president.getAction() + " " + this.name + ",辛苦了,下班了!");
// }
public void update(Observable o, Object arg) {
this.updateMyself(o);
}
//如果更新自己行为的方法名在之前已经定义好,那么需要在update方法中调用即可
//相当于代理方法
public void updateMyself(Observable o) {
President president = null;
if (o instanceof President) {
president = (President)o;
}
System.out.println(president.getAction() + " " + this.name + ",辛苦了,下班了!");
}
}
总结:观察者模式:当一个对象的状态发生改变的时候,需要同时通知一个或多个对象更新自己的行为。