• Java设计模式之观察者模式

    发布:51Code 时间: 2018-04-02 13:41

  • 代码结构: 概念: 观察者模式要同时存在观察者和被观察者双方,观察者可以是多个。在Java中,需要去继承java.util.Observable类,先看被观察者(一个产品列表),如下代码: import java.u...

  • 代码结构:

    概念:

    观察者模式要同时存在观察者和被观察者双方,观察者可以是多个。在Java中,需要去继承java.util.Observable类,先看被观察者(一个产品列表),如下代码:

    import java.util.ArrayList;

    import java.util.List;

    import java.util.Observable;

    import java.util.Observer;

    /**

    * 被观察的产品列表

    * @author Administrator

    *

    */

    public class ProductList extends Observable {

    private List<String> producList = null;// 产品列表

    private static ProductList instance;// 类的唯一实例

    private ProductList() {// 私有构造器

    }

    /**

    * 获取唯一实例

    *

    * @return 产品列表唯一实例

    */

    public static ProductList getInstance() {

    if (instance == null) {

    instance = new ProductList();

    instance.producList = new ArrayList<String>();

    }

    return instance;

    }

    /**

    * 增加观察者(电商接口)

    *

    * @param observer观察者

    */

    public void addProductListObserver(Observer observer) {

    this.addObserver(observer);

    }

    /**

    * 新增产品

    *

    * @param newProduct新产品

    */

    public void addProduct(String newProduct) {

    producList.add(newProduct);

    System.out.println("产品列表新增了产品:" + newProduct);

    this.setChanged();// 设置被观察对象发生变化

    this.notifyObservers(newProduct);// 通知观察者,并传递新产品

    }

    }

    上面这个类的一些基本内容和主要方法如下:

    1、构造方法私有化,避免通过new的方式创建对象,而是通过getInstance方法获取产品列表清单,这里使用的是单例模式。

    2、addProducListObserver可以增加一个电商接口(观察者)。

    3、核心逻辑在addProduct方法上。在产品列表上增加了一个新的产品,然后调用setChanged方法。这个方法用于告知观察者当前被观察者发生了变化,如果没有,则无法触发其行为。最后通过notifyObservers告知观察者,让他们发生相应的动作,并将新产品作为参数传递给观察者。

    这时已经有了被观察者对象,还要去编写观察者。以淘宝和京东威力,去实现他们的电商接口。作为观察者需要实现java.util.Observer接口的update方法,如下所示:

    import java.util.Observable;

    import java.util.Observer;

    /**

    * 京东电商接口

    * @author Administrator

    *

    */

    public class JingDongObserver implements Observer{

    @Override

    public void update(Observable o, Object product) {

    String newProduct = (String) product;

    System.out.println("发送新产品["+newProduct+"]同步到京东商城");

    }

    }

    import java.util.Observable;

    import java.util.Observer;

    /**

    * 淘宝电商接口

    * @author Administrator

    *

    */

    public class TaoBaoObserver implements Observer{

    @Override

    public void update(Observable o, Object product) {

    String newProduct = (String) product;

    System.out.println("发送新产品["+newProduct+"]同步到淘宝商城");

    }

    }

    创建测试类这两个观察者和产品列表的被观察者,代码如下:

    public class Test {

    public static void main(String[] args) {

    ProductList observable = ProductList.getInstance();

    TaoBaoObserver taoBaoObserver = new TaoBaoObserver();

    JingDongObserver jingDongObserver = new JingDongObserver();

    observable.addObserver(taoBaoObserver);

    observable.addObserver(jingDongObserver);

    observable.addProduct("新增产品1");

    }

    }

    增加横线的代码是对被观察者注册观察者,这样才能让观察者监控到被观察者的变化情况,运行上面代码得到如下结果:

    产品列表新增了产品:新增产品1

    发送新产品[新增产品1]同步到京东商城

    发送新产品[新增产品1]同步到淘宝商城

    结论:以后在产品列表发布新产品,观察者们都可以触发对应的行为了,就不会出现if语句的各类问题,更利于扩展和维护。
     

    本文原作者:帅过驴的袋鼠
    文章来源:博客园
  • 上一篇:2018年最火热Top10Java框架,你该会哪些?

    下一篇:Java面试通关要点核心篇-数据存储

网站导航
Copyright(C)51Code软件开发网 2003-2018 , 沪ICP备05003035号