• 意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

实现

被观察者

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("可口可乐");
    }
}

运行结果
图片加载失败