博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java设计模式之观察者模式
阅读量:6605 次
发布时间:2019-06-24

本文共 4822 字,大约阅读时间需要 16 分钟。

创建产品对象,产品对象要继承Observable

package cn.quangaoleng;import java.util.ArrayList;import java.util.List;import java.util.Observable;import java.util.Observer;public class ProductList extends Observable {    private List
listProduct = null; private static ProductList instance; private ProductList(){ } public static ProductList getInstance(){ if(instance==null){ instance= new ProductList(); instance.listProduct = new ArrayList<>(); } return instance; } @Override public synchronized void addObserver(Observer o) { super.addObserver(o); } public void addProduct(String newProduct){ listProduct.add(newProduct); System.out.println("正在添加产品"); this.setChanged(); this.notifyObservers(newProduct); }}class TaoBaoObserver implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("淘宝得到新产品"+(String)arg); }}class JingDongObserver implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("京东得到新产品"+(String)arg); }}复制代码

+创建观察者京东

package cn.quangaoleng;import java.util.ArrayList;import java.util.List;import java.util.Observable;import java.util.Observer;public class ProductList extends Observable {    private List
listProduct = null; private static ProductList instance; private ProductList(){ } public static ProductList getInstance(){ if(instance==null){ instance= new ProductList(); instance.listProduct = new ArrayList<>(); } return instance; } @Override public synchronized void addObserver(Observer o) { super.addObserver(o); } public void addProduct(String newProduct){ listProduct.add(newProduct); System.out.println("正在添加产品"); this.setChanged(); this.notifyObservers(newProduct); }}class TaoBaoObserver implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("淘宝得到新产品"+(String)arg); }}class JingDongObserver implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("京东得到新产品"+(String)arg); }}复制代码

创建观察者淘宝

package cn.quangaoleng;import java.util.ArrayList;import java.util.List;import java.util.Observable;import java.util.Observer;public class ProductList extends Observable {    private List
listProduct = null; private static ProductList instance; private ProductList(){ } public static ProductList getInstance(){ if(instance==null){ instance= new ProductList(); instance.listProduct = new ArrayList<>(); } return instance; } @Override public synchronized void addObserver(Observer o) { super.addObserver(o); } public void addProduct(String newProduct){ listProduct.add(newProduct); System.out.println("正在添加产品"); this.setChanged(); this.notifyObservers(newProduct); }}class TaoBaoObserver implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("淘宝得到新产品"+(String)arg); }}class JingDongObserver implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("京东得到新产品"+(String)arg); }}复制代码

这是一个观察者模式的代码。被观察的对象采用单例模式,继承observable,而观察者实现observer的接口,通过update方法得到observable 参数的通知

猜测:通过前面的代码,观察者模式应该也是通过反射去实现的, 在调用父类的addObserver方法时,将添加的实现了observer接口的对象存储下来,因为观察者对象是通过Observer的接口类型接收的,所以一定实现了update方法且参数固定, 在调用notifyObservers方法时,被观察者这个类去找add方法存储的的观察者对象,通过反射创建观察者的实例,再实现此实例的update方法 (这段代码只是一段猜测,或者说是自己实现观察者模式的一个思路,并不一定正确,内部也不一定这样实现)

在猜测后看了Observable的代码,内部的确是用一个 Vector obs去存储的,至于 boolean changed = false;应该是一个标志

public void notifyObservers(Object arg) {            Object[] arrLocal;            synchronized (this) {                if (!changed)                    return;                arrLocal = obs.toArray();                clearChanged();            }            for (int i = arrLocal.length-1; i>=0; i--)                        ((Observer)arrLocal[i]).update(this, arg);      }复制代码

调用ontifyObservver方法时,一个个去调用存储的观察者的update方法,这里的changed标志,应该和

public synchronized void addObserver(Observer o) {              if (o == null)                  throw new NullPointerException();              if (!obs.contains(o)) {                  obs.addElement(o);              }          }复制代码

这段代码中的如果已有则跳过一样,都是对于代码的优化,而且同步也避免了在添加时出现对已有的进行二次添加

如果思考一个场景,被观察者手中有产品,而观察者坐在被观察者家中的沙发上,当我们添加一个公 司的另一个业务员,他就会挡在门外,当把新产品放在被观察者模式手中, 对着被观察者喊一声:Hello,有新产品了;然后当调用notifyObserver方法时,被观察者判断你告诉你有新产品了吗,你告诉了我才做,如果你说了有新产品,好,被观察者将 手中的这款产品递给沙发上的每一个人,这个代码可能十分简单,但是一些优化的方法,例如同步,判断重复,标志变量来决定是否执行一个较为耗时的方法,还是值得学习的

转载于:https://juejin.im/post/5b62fcaf6fb9a04f8c5ef7a4

你可能感兴趣的文章
Unity 碰撞检测中碰撞器与触发器的区别
查看>>
Elasticsearch配置文件说明
查看>>
路由表的构成
查看>>
初识java
查看>>
temporary Object and destructor
查看>>
xcode - 移动手势
查看>>
本地上jar命令
查看>>
细说浏览器特性检测(1)-jQuery1.4添加部分
查看>>
古中国数学家的计算力真是惊人
查看>>
XMl各种格式转换功能代码
查看>>
Java基础-算术运算符(Arithmetic Operators)
查看>>
XML 基础
查看>>
C#编程(四十七)----------集合接口和类型
查看>>
java的Date() 转换符
查看>>
手机浏览器旋转为宽屏模式下文字会自动放大的解决方案
查看>>
【转】关于大型网站技术演进的思考(十二)--网站静态化处理—缓存(4)
查看>>
积跬步,聚小流------Bootstrap学习记录(1)
查看>>
HDUPhysical Examination(贪心)
查看>>
HTML5 FileAPI
查看>>
使用tdcss.js轻松制作自己的style guide
查看>>