简述
观察者模式又称为发布订阅模式,是对象的行为模式。观察者模式定义了一种一对多的依赖关系,多个观察者共同订阅着一个被观察者。当被观察者发生变化时,观察者们会做出相应的变化。
在日常生活中,也有着观察者模式的案例。如一个产品列表被多个电商所订阅,每当这个产品列表有更新时,就需要向各大电商平台去推送新产品。
在Java中实现观察者模式,被观察者需要继承java.util.Observable类,而观察者需要实现java.util.Observer的update方法
代码示例
本demo代码可到观察者模式中去下载
【产品列表类】
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<>(); } 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);//通知观察者(各大电商),并传递新产品 } }
【京东】
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.err.println("发送新产品【" + 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.err.println("发送新产品【" + newProduct + "】到淘宝商城"); } }
【测试】
public class TestObserver { public static void main(String[] args) { ProductList productList = ProductList.getInstance(); productList.addProductListObserver(new JingDongObserver());//京东订阅 productList.addProductListObserver(new TaoBaoObserver());//淘宝订阅 productList.addProduct("Java编程思想"); } }
【结果】
运行结果
作者:写代码的白大侠
链接:https://www.jianshu.com/p/cbb587cee91a