Java设计模式之观察者模式

简述

  • 观察者模式又称为发布订阅模式,是对象的行为模式。观察者模式定义了一种一对多的依赖关系,多个观察者共同订阅着一个被观察者。当被观察者发生变化时,观察者们会做出相应的变化。
  • 在日常生活中,也有着观察者模式的案例。如一个产品列表被多个电商所订阅,每当这个产品列表有更新时,就需要向各大电商平台去推送新产品。
  • 在Java中实现观察者模式,被观察者需要继承java.util.Observable类,而观察者需要实现java.util.Observer的update方法

代码示例

本demo代码可到观察者模式中去下载
【产品列表类】

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

public class ProductList extends Observable {

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

    private static ProductList instance;//唯一实例

    private ProductList(){} //构建方法私有化,防止使用者去new对象

    /**
     * @return 产品列表唯一实例
     */
    public static ProductList getInstance(){
        if(instance == null){
            instance = new ProductList();
            instance.productList = new ArrayList<>();
        }

        return instance;
    }


    /**
     * 增加观察者(电商接口)
     * @param observer 观察者
     */
    public void addProductListObserver(Observer observer){
        this.addObserver(observer);
    }


    /**
     * 核心逻辑 增加产品就会通知已经订阅的观察者
     * @param newProduct 新产品
     */
    public void addProduct(String newProduct){
        productList.add(newProduct);
        System.out.println("产品列表新增产品:" + newProduct + ",自动通知各大电商!");
        this.setChanged();//被观察者发生变化
        this.notifyObservers(newProduct);//通知观察者(各大电商),并传递新产品
    }
}

【京东】

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

public class JingDongObserver implements Observer {
    @Override
    public void update(Observable o, Object product) {
        String newProduct = (String) product;
        System.err.println("发送新产品【" + newProduct + "】到京东商城");
    }
}

【淘宝】

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

public class TaoBaoObserver implements Observer {
    @Override
    public void update(Observable o, Object product) {
        String newProduct = (String) product;
        System.err.println("发送新产品【" + newProduct + "】到淘宝商城");
    }
}

【测试】

public class TestObserver {
    public static void main(String[] args) {
        ProductList productList = ProductList.getInstance();
        productList.addProductListObserver(new JingDongObserver());//京东订阅
        productList.addProductListObserver(new TaoBaoObserver());//淘宝订阅
        productList.addProduct("Java编程思想");
    }
}

【结果】


运行结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概念   观察者模式:又称发布(publish)-订阅(Subscribe)模式、模型(Model)-视图(Vie...
    bamboolmc阅读 260评论 1 0
  • Java设计模式之-观察者模式(Observer) 如果你发现一件心仪的商品,但是由于双十一已经剁手了,只能等到打...
    Mock2052阅读 812评论 0 0
  • 气象站系统:气象站可以通过物理装置取得气象信息,WeatherData对象可以通过气象站提供的外部接口获取气象信息...
    java部落阅读 284评论 0 0
  • 曾经有一个这样对你好的人:你懦弱胆怯的时候鼓励你;你掉手机没钱的时候给你送生活费送手机;给你充话费,叫你早点睡觉不...
    微微蔷薇阅读 143评论 0 0
  • 学法语之前,认为“法语是世界上最美的语言”这一评论有点扯,后来才发现当时是自己见识少、浅薄。 “French is...
    057Bonnie阅读 177评论 5 1