观察者模式,很简单,他把事物分为两派,一派是观察者,另一派是被观察者。观察者将会注册到被观察者,当被观察者发生变动时,会通知观察者。
观察者需实现Observer接口,重写update()方法。
被观察者需继承Observable类,添加变动触发方法xx()【在里面设置触发条件,调用this.setChanged()设置变化位,调用this.notifyObservers()通知所有观察者】,添加观察对象注册方法addXYXY(Observer o)[注意千万不要想直接重写父类的addObserver()方法,该方法会导致栈溢出异常,我也不知道为啥。]。
下面给一个案例,想象你是一个经营网店的店长,你在京东和淘宝分别开有一个店铺,当有新货到手时,你需要推送商品到两家电商。产品列表作为被观察者,京东和淘宝作为观察者。
代码如下:
//被观察者
/**
* @Author: HouJun
* @Date: 2019/10/23 8:28
* @Description: 观察者/监测者模式
* @version: 1.0
*/
public class ProductList extends Observable {
private List<String> productList = null;
private static ProductList instance;
//私有化构造器,单例模式
private ProductList() {
}
public static ProductList getInstance() {
if (instance == null) {
instance = new ProductList();
instance.productList = new ArrayList<>();
}
return instance;
}
//注册观察者对象 方法 增加观察者对象 需要注意的是不能重写父类的addObserver()会报异常,提示栈溢出
public void addProductListObserver(Observer o) {
this.addObserver(o);
}
@Override
public synchronized void addObserver(Observer o) {
super.addObserver(o);
}
public void addProduct(String newProduct) {//当我调用此方法时,会触发自动 观察者的update方法
productList.add(newProduct);
System.out.println("产品列表新增了产品" + newProduct);
this.setChanged();//设置被观察对象发生了变化
this.notifyObservers(newProduct);//通知观察者,并发送信息给他。
}
@Override
public String toString() {
return "ProductList{" +
"productList=" + productList +
'}';
}
}
//观察者1
public class JingdongObserver implements Observer {
@Override
public void update(Observable o, Object arg) {//据我推测,o是被观察者,一个观察者可以观察多个被观察者,arg是被观察者发送给观察者的 变动信息
System.out.println("已经收到被观察者"+o+"发送观察者京东 的信息:"+arg);
}
}
//观察者2
public class TaobaoObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("已经收到被观察者"+o+"发送观察者淘宝 的信息"+arg);
}
}
//测试类
public class Test
{
public static void main(String[] args) {
ProductList productList = ProductList.getInstance();
productList.addProductListObserver(new JingdongObserver());//添加观察者京东
productList.addProductListObserver(new TaobaoObserver());//添加观察者淘宝
productList.addProduct("新华字典");
}
}