一 前言
再看一种实现观察者模式的方法,使用 Obsrvable 和 Observer, 在 JDK9 之后就不推荐了,可以作为一种了解看看。
首先了解,他只有两种角色,一个是目标,一个是观察者。
目标:也即被观察者,需要继承 Observable 类
观察者:需要实现 Observer 类
二 代码实现
目标类(也即被观察者类):
/**
* 被观察者即 目标 需要继承 Observable 类
*/
public class PeopleList extends Observable {
private List<String> peopleList =null;//人员列表
private static PeopleList instance=null;//类唯一实例
private PeopleList(){};//构建方法私有化
//取唯一实例
public static PeopleList getInstance(){
if (instance==null){
instance=new PeopleList();
instance.peopleList=new ArrayList<>();
}
return instance;
}
/**
* 增加观察者对象(人员池接口)
* observer观察者
*/
public void addPeopleListObservable(Observer observer){
this.addObserver(observer);
}
/**
* 增加商品
* newProduct新产品
*/
public void addNewPeople(String newPeople){
peopleList.add(newPeople);
System.out.println("增加新人员");
this.setChanged();//设置被观察者(人员列表)发生变化
this.notifyObservers(newPeople);//通知人员接口(观察者)发生变化
}
}
观察者类,观察者可以有多个,这里举例两个:
/**
* 观察者需要实现java.util.Observer接口的update方法
*/
public class DepartmentAObserver implements Observer {
PeopleList peopleList=PeopleList.getInstance();
@Override
public void update(Observable o, Object product) {
String newProduct=(String)product;
System.out.println("增加新人员同步到部门A"+product);
}
}
/**
* 观察者需要实现java.util.Observer接口的update方法
*/
public class DepartmentBObserver implements Observer {
PeopleList peopleList=PeopleList.getInstance();
@Override
public void update(Observable o, Object product) {
String newProduct=(String)product;
System.out.println("增加新人员同步到部门B"+product);
}
}
功能代码都完成了,现在写测试代码:
public class ObserverTest {
public static void main(String[] args) {
PeopleList peopleList=PeopleList.getInstance();//获得被观察者唯一对象
DepartmentAObserver departmentAObserver=new DepartmentAObserver();
DepartmentBObserver departmentBObserver=new DepartmentBObserver();
peopleList.addObserver(departmentAObserver);//addObserver被观察者(产品列表)注册观察者
peopleList.addObserver(departmentBObserver);
peopleList.addNewPeople("新增人员");
}
}
运行测试类:
增加新人员
增加新人员同步到部门B新增人员
增加新人员同步到部门A新增人员
到这代码,完成了,需要重点看的是 目标类的写法。
三 总结
虽然不推荐使用了,但是可以作为了解看看,实现起来不是特别复杂。加上业务的话可能会繁琐,需要理解透彻