观察者模式,很简单,他把事物分为两派,一派是观察者,另一派是被观察者。观察者将会注册到被观察者,当被观察者发生变动时,会通知观察者。
观察者需实现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("新华字典"); } }