zoukankan      html  css  js  c++  java
  • 观察者模式

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

    观察者需实现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("新华字典");
        }
    }
  • 相关阅读:
    MVC filter
    常见的页面中两个div自适应等高CSS控制
    字符串排序 获取字符串中最长的单词
    js中“==”与“===”区别
    数组中字符串按照长度大小排序
    jquery中ajax使用
    关于ajax
    父级div宽度100%,子级一个div宽度固定,另一个宽度自适应
    window.onload与$(document).ready()区别
    盒模型
  • 原文地址:https://www.cnblogs.com/houj/p/11724551.html
Copyright © 2011-2022 走看看