2020 Java设计模式 - 观察者模式

3 观察者模式

  观察者模式又称发布订阅模式,是对象的行为模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听着被观察者的状态,当被观察者的状态发送变化时,会通知所有观察者,并让其自动更新自己。
  观察者模式要同时存在观察者和被观察者双方,观察者可以是多个。在Java中,需要继承java.util.Observable类。
被观察者的产品列表:

package com.feike.observer;

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

/**
 * @ProjectName: chapter2
 * @Package: com.feike.observer
 * @ClassName: ProductList
 * @author: Feike
 * @description:
 * @date: 2020/6/28 21:33
 * @version: 1.0
 */
public class ProductList extends Observable {
    /**
     * 产品列表
     */
    private List<String> productList = null;
    /**
     * 类唯一实例
     */
    private static ProductList instance;

    /**
     * 获取唯一实例
     * @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);
    }

    public void addProduct(String newProduct){
        productList.add(newProduct);
        System.out.println("产品列表新增了产品:" + newProduct);
        //设置被观察者发生了变化
        this.setChanged();
        //通知观察者,并传递新产品
        this.notifyObservers(newProduct);
    }

}
  • 构建方法私有化,避免通过new的方式创建对象,而是通过getInstance方法获得产品列表单例,这里使用的是单例模式。
  • addProductListObserver 可以增加一个电商接口(观察者)
  • 核心逻辑在addProduct方法上。在产品列表上增加了一个新的产品,然后调用setChanged方法。这个方法用于告知观察者放生了变化,如果没有,则无法触发其行为。最后通过notifyObserve告知观察者,让它们发生相应的动作,并将新产品作为参数传递给观察者。

京东电商接口:

public class JingDongObserver implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        String newProduct = (String) arg;
        System.out.println("发送新产品【" + newProduct+ "】同步到京东商城!");
    }
}

淘宝电商接口:

public class TaobaoObserver implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        String newProduct = (String) arg;
        System.out.println("发送新产品【"+newProduct+"】同步到淘宝商城");
    }
}

测试观察者模式:

    @Test
    public void test(){
        ProductList observable = ProductList.getInstance();
        TaobaoObserver taobaoObserver = new TaobaoObserver();
        JingDongObserver jingDongObserver = new JingDongObserver();
        observable.addObserver(jingDongObserver);
        observable.addObserver(taobaoObserver);
        observable.addProduct("鼠标");
    }

测试结果:

产品列表新增了产品:鼠标
发送新产品【鼠标】同步到淘宝商城
发送新产品【鼠标】同步到京东商城!

工厂模式和抽象工厂模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章