观察者模式

南楼画角 提交于 2019-12-02 01:56:45

观察者模式,很简单,他把事物分为两派,一派是观察者,另一派是被观察者。观察者将会注册到被观察者,当被观察者发生变动时,会通知观察者。

观察者需实现Observer接口,重写update()方法。

被观察者需继承Observable类,添加变动触发方法xx()【在里面设置触发条件,调用this.setChanged()设置变化位,调用this.notifyObservers()通知所有观察者】,添加观察对象注册方法addXYXY(Observer o)[注意千万不要想直接重写父类的addObserver()方法,该方法会导致栈溢出异常,我也不知道为啥。]。

下面给一个案例,想象你是一个经营网店的店长,你在京东和淘宝分别开有一个店铺,当有新货到手时,你需要推送商品到两家电商。产品列表作为被观察者,京东和淘宝作为观察者。

代码如下:

//被观察者
/**
 * @Author: HouJun
 * @Date: 2019/10/23 8:28
 * @Description: 观察者/监测者模式
 * @version: 1.0
 */
public class ProductList extends Observable {
    private List<String> productList = null;
    private static ProductList instance;

    //私有化构造器,单例模式
    private ProductList() {
    }

    public static ProductList getInstance() {
        if (instance == null) {
            instance = new ProductList();
            instance.productList = new ArrayList<>();
        }
        return instance;
    }

    //注册观察者对象 方法        增加观察者对象  需要注意的是不能重写父类的addObserver()会报异常,提示栈溢出
    public void addProductListObserver(Observer o) {
        this.addObserver(o);
    }

    @Override
    public synchronized void addObserver(Observer o) {
        super.addObserver(o);
    }

    public void addProduct(String newProduct) {//当我调用此方法时,会触发自动 观察者的update方法
        productList.add(newProduct);
        System.out.println("产品列表新增了产品" + newProduct);
        this.setChanged();//设置被观察对象发生了变化
        this.notifyObservers(newProduct);//通知观察者,并发送信息给他。
    }

    @Override
    public String toString() {
        return "ProductList{" +
                "productList=" + productList +
                '}';
    }
}
//观察者1
public class JingdongObserver implements Observer {
    @Override
    public void update(Observable o, Object arg) {//据我推测,o是被观察者,一个观察者可以观察多个被观察者,arg是被观察者发送给观察者的    变动信息
        System.out.println("已经收到被观察者"+o+"发送观察者京东 的信息:"+arg);
    }
}
//观察者2
public class TaobaoObserver implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("已经收到被观察者"+o+"发送观察者淘宝 的信息"+arg);
    }
}
//测试类
public class Test
{
    public static void main(String[] args) {
        ProductList productList = ProductList.getInstance();
        productList.addProductListObserver(new JingdongObserver());//添加观察者京东
        productList.addProductListObserver(new TaobaoObserver());//添加观察者淘宝
        productList.addProduct("新华字典");
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!