• Java中设计模式之观察者模式详解与实现


    package com.xiawei.observer;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Observable;
    import java.util.Observer;

    /**
    * 这里我们来了解一下观察者模式,它也叫发布订阅模式。
    * 那么我们带着三个问题去了解:1.什么是观察者模式?
    * 2.观察者模式有什么用?3.如何设计观察者模式?
    * 1.什么是观察者模式?
    * 所谓观察者模式,就是对象间的一种一对多的依赖关系。
    * 当一个对象发生改变时,所有依赖他的对象都会得到通知
    * 并被自动更新。
    * 2.观察者模式有什么用?
    * 有利于程序后续的扩展,使代码功能的责任更加清晰,遵循
    * 了编程的单一职责原则。
    * 3.如何设计观察者模式?
    * 至于如何设计观察者模式,我们一起来看我以下的代码实现:
    * 咚咚咚!开始。。。
    *
    */
    //首先在写代码之前,我们要知道,观察者模式,就是体现在观察上面。那么观察谁呢?
    //观察美女。当然不是,哈哈哈。不过说到观察美女,那么美女就是一个被观察者了。
    //哈哈哈。其实这里我要引出的是,观察者和被观察者这两个对象。
    //下面我们以网上商品供应者和网络商城为例,供应商推出了新产品,那么与他合作的
    //网上商城必须倒要被通知到,但你又不能一个一个在后台向每个商城去做维护,这是不
    //能的,所以我们必须想一个办法,使其达到,只要供应商商品有改变,所有与他合作
    //的网络商城都会被统一通知到。这里就用NB的观察者模式来解决。
    /**
    * 被观察者</p>
    * 产品列表</p>
    *
    */
    //作为被观察者,她需要继承Observable这个类
    public class ProductLists extends Observable{

    //定义一个产品列表
    private List<String> productList = null;
    //定义类的唯一实例(静态化ProductLists)
    private static ProductLists instance = null;
    //构建方法私有化
    //写到这里我们来复习一下,什么是构建方法私有化?
    //构建方法私有化,就是说这个类的构造方法被私有化了,外面不能使用了
    //也就是外面不能去new这个类的对象了.外面在内部给他实例画一个对象
    //然后在通过方法到内部来获取他,就可以了.
    private ProductLists(){}

    /**
    * 通过单例模式,来获取当前类的唯一实例
    * return 产品列表对象的唯一实例
    */
    public static ProductLists getInstance(){
    if(instance == null){
    instance = new ProductLists();
    instance.productList = new ArrayList<String>();
    }
    return instance;

    }

    /**
    * 增加观察者(电商接口)
    */
    public void addProductListsObserver(Observer observer){
    this.addObserver(observer);
    }
    //其实上面这个方法也可以不要,可以直接调用Observable类中的addObserver()方法

    /**
    * 动作:增加新产品
    * @param 新品
    */
    public void addProduct(String newProduct){
    //向产品列表中增加新产品
    productList.add(newProduct);
    //打印一下,看看
    System.out.println("产品列表中增加了新产品:"+newProduct+"。");
    //设置被观察者对象发生改变(也就是标记此observer对象为已经改变了的对象)
    this.setChanged();//这个方法是重点
    //来看一下被观察对象是否已被改变,用Observable类的hasChanged()方法,如果改变这个
    //方法返回true,否则返回false
    System.out.println("被观察者对象是否改变:"+this.hasChanged());
    //通知观察者,并传递新增产品信息到观察者
    this.notifyObservers(newProduct);
    }
    }

    ========================================================

    package com.xiawei.observer;

    import java.util.Observable;
    import java.util.Observer;

    //下面来创建一个观察者
    /**
    * 观察者--淘宝商城 </p>
    * 这个类要去实现一下Observer这个接口.并实现其update()方法
    */
    public class TaoBaoObserver implements Observer{

    @Override
    public void update(Observable o, Object product) {

    String newProduct = (String) product;
    //模拟一下观察者的变化
    System.out.println("发送新产品["+newProduct+"]同步到淘宝商城上了!");
    }


    }

    ========================================================

    package com.xiawei.observer;

    import java.util.Observable;
    import java.util.Observer;
    //下面来创建第二个观察者
    /**
    * 观察者--京东商城 </p>
    * 这个类要去实现一下Observer这个接口.并实现其update()方法
    */
    public class JingDongObserver implements Observer {

    @Override
    public void update(Observable o, Object product) {

    String newProduct = (String) product;
    //模拟一下观察者的变化
    System.out.println("发送新产品["+newProduct+"]同步到京东商城上了!");

    }

    }

    =========================================================

    package com.xiawei.observer;

    public class TestObserver {

    public static void main(String[] args) {

    //获取被观察者对象
    ProductLists observer = ProductLists.getInstance();
    //获取观察者对象
    JingDongObserver jingDongObserver = new JingDongObserver();
    //获取第二个观察者对象
    TaoBaoObserver taoBaoObserver = new TaoBaoObserver();
    //被观察者注册观察者(这个很重要)
    observer.addObserver(jingDongObserver);
    observer.addObserver(taoBaoObserver);
    //传入观察者的变化内容
    observer.addProduct("新品X");

    }

    }

     代码运行结果:

      产品列表中增加了新产品:新品X。
      被观察者对象是否改变:true
      发送新产品[新品X]同步到淘宝商城上了!
      发送新产品[新品X]同步到京东商城上了!

  • 相关阅读:
    【OpenCV学习】安防监控可疑走动报警
    【OpenCV学习】OpenMP并行化实例
    【OpenCV学习】cvConvert的使用
    【OpenCV学习】Fuzzy Logic模糊逻辑边缘提取
    C# 委托系列(一)将方法作为方法的参数
    关于dev的Gridview控件的行数据的颜色控制,根据不同的值设置不同颜色
    将gridcontrol导出到excel
    DataGridView中将某行设置为当前可见区域第一行
    如何获得窗体上控件相对于屏幕的位置?
    dev 控件 lookupedit 设置选项值
  • 原文地址:https://www.cnblogs.com/xiaweicn/p/8678515.html
Copyright © 2020-2023  润新知