观察者模式
- 意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
实现
被观察者
public class ProductList extends Observable {
private List<String> productList = null;
private static ProductList instance;
private ProductList() {}
/**
* 单例模式 懒加载 DCL
* @return 唯一实例
*/
public static ProductList getInstance() {
if(instance == null) {
synchronized (ProductList.class) {
if(instance == null) {
instance = new ProductList();
instance.productList = new ArrayList<>();
}
}
}
return instance;
}
/**
* 增加观察者
* @param observer 观察者
*/
public void addProductListObserver(Observer observer) {
this.addObserver(observer);
}
/**
* 新增产品
* @param newProduct 新产品
*/
public void addProduct(String newProduct) {
productList.add(newProduct);
System.out.println("新增产品: " + newProduct);
this.setChanged();
this.notifyObservers(newProduct);
}
}
多个观察者
public class StoreObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
String newProduct = (String) arg;
System.out.println("INFO::Store观察到新增产品: " + newProduct);
}
}
public class SupermarketObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
String newProduct = (String) arg;
System.out.println("INFO::Supermarket观察到新增产品: " + newProduct);
}
}
调用
public class ObserverPatternDemo {
public static void main(String[] args) {
// 获取产品列表(被观察者)
ProductList productList = ProductList.getInstance();
// 新建观察者实例
StoreObserver storeObserver = new StoreObserver();
SupermarketObserver supermarketObserver = new SupermarketObserver();
// 给被观察者添加观察者
productList.addProductListObserver(storeObserver);
productList.addProductListObserver(supermarketObserver);
// 被观察者发生变化
productList.addProduct("可口可乐");
}
}
运行结果