观察者模式

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

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

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

11月7号更新,昨天去一个外包公司面试,到了最后和面试官聊天阶段,听说我读过《编程思想》,就问题对于接口和抽象类的理解,我无语德彼得扯了一会,被他打断,我也没背过概念,只能凭着感觉说,看到他终止手势,闭嘴了,然后又问了我观察者模式,我明明写过文章还是忘了,真他妈废物。最后因为薪酬没谈成,他就想找一个搬砖的,给的价很低,折合成时薪还不如我现在。摆这个脸给我硬硬装了一笔。我六点多从那出来时,没见一个人有下班的意思,而且用的还是上古时代的Struts框架IE浏览器,想必在那工作更煎熬。

哎初级程序员真难啊,我还是努努力,争取早日进入互联网公司。加油。

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

代码如下:

//被观察者
/**
 * @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("新华字典");
    }
}

 

posted @ 2019-10-23 10:05  侯上进  阅读(178)  评论(0编辑  收藏  举报