观察者模式是一种一对多的依赖关系,设置了多个观察者对象来监视被观察对象的状态,当被观察对象发生变化时候,通知所有观察对象来相应这种变化。 Observable 被观察对象需要继承此类,以下方法均为此类方法 1. 新增观察者方法 addObserve 2. 标志被观察者变化 setChange 3. 告知观察者 notifyObservers Observer 观察者需要实现这个接口,并且实现其中的update方法作为当被观察者发生变化时候的响应。下面提供一个例子
存在一个供货商为淘宝和京东供货,我们认为供货商为被观察对象,
当新增一种产品时,作为观察者对象的淘宝和京东也要将新增产品上架销售。
被观察者代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
public class ProductList extends Observable {
private List<String> productList = null; //产品列表
private static ProductList instance; //类的唯一实例
private ProductList(){}; //构造方法私有化,不允许在类外new对象
/**
* 取得了唯一实例,单例模式。
* @return
*/
public static ProductList getInstance(){
if(instance == null){
instance = new ProductList();
instance.productList = new ArrayList<String>();
}
return instance;
}
/**
* 新增观察者接口
*/
public void addProductListObserver(Observer observer){
this.addObserver(observer);
}
/**
* 新增产品
* 核心方法为:
* setChanged 设置内部标志,指示被观察对象发生变化。
* notifyObservers 通知各个观察者对象。
*/
public void addProduct(String newProduct){
productList.add(newProduct);
this.setChanged();//设置被观察对象发生变化
this.notifyObservers(newProduct);//通知观察者,并传递新产品
}
}
观察者代码
import java.util.Observable;
import java.util.Observer;
public class TaoBaoObserver implements Observer {
@Override
public void update(Observable o, Object Product) {
String newProduct = (String) Product;
System.out.println("TB新增产品:" +newProduct);
}
}
import java.util.Observable;
import java.util.Observer;
public class JingDongObserver implements Observer {
@Override
public void update(Observable o, Object Product) {
String newProduct = (String) Product;
System.out.println("JD新增产品:" +newProduct);
}
public static void main(String[] args) {
ProductList observable = ProductList.getInstance(); // 创建被观察对象
JingDongObserver jdObserver = new JingDongObserver();
TaoBaoObserver tbObserver = new TaoBaoObserver();
observable.addObserver(jdObserver);
observable.addObserver(tbObserver);
observable.addProduct("新增产品1");
}
}