JAVA中的观察者模式(Observer)

观察者模式又被称为发布订阅模式,是对象的一种行为模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监视着被观察者的状态,当被观察者的状态发生变化的时候,会通知所有的观察者,并且让他们自己去更新自己。
这么说可能不是很明白 ,用个最简单的例子来说吧,目前比较操蛋的电商,

if(产品库有新的产品){
推送产品到淘宝
推送产品到京东
}

这样的也就是说,如果公司和国美,苏宁,当当这些个签订了协议,那么就需要改动这段伪代码

if(产品库有新的产品){
推送产品到淘宝
推送产品到京东
推送产品到国美
推送产品到苏宁
推送产品到当当
。。。。。。
}

如果说按着这说法,那特么凉了,如果和其他电商合作,那继续在if里面加逻辑,这样代码维护起来复杂的很,
而且也会出现责任不清楚的状态。
而观察者模式更加的易于扩展,首先把每个电商的接口看成观察者,那么相应的产品库就是被观察者,没一个观察者都能看到产品的列表(被监听的对象),每次发布新产品,就到这个列表里面去,这时候出发各个电商接口发送新的产品到对应的合作电商里面
来个图
在这里插入图片描述

类似这个,电商接口就被称之为观察者或者说是监听者,二产品对象就被称为被观察者或者是被监听者
下面来一段代码实例解释、
首先是被观察的产品列表

package com.yldyyn.test;

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(){}//构建私有方法
    /**
     * 取得唯一的实例
     */
    public static ProductList getInstance(){
        if (instance == null){
            instance =new ProductList();
            instance.productList = new ArrayList<String>();
        }
        return instance;
    }

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

    /**
     * 新增产品
     * @param newProduct 新产品
     */
    public void addProduct(String newProduct){
        productList.add(newProduct);
        System.out.println("产品列表新增了产品:"+newProduct);
        this.setChanged();//设置被观察对象发生变化
        this.notifyObservers(newProduct);//通知观察者并且传递新的产品
    }
}

这个类里面的基本方法解释一下
构建方法私有化,避免了通过new的方式创建对象,而是通过getInstance方法获得产品列表的单利,使用的是单例模式!

addProdcutListObserver这个方法是用来增加电商接口的(也就是说他是一个观察者)
核心的逻辑都在后边的addProdcut上面,而后边的notifyObservers就是通知观察者他们发生了相应的动作了,

这个时候已经是有了被观察者对象,我们还需要编写观察者,仍然使用淘宝京东这为例子,去实现他们的电商接口,作为观察和需要实现java.util.Observer接口的Update方法,
代码如下所示

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

public class JingDongObserver implements Observer {
    /**
     * 这是京东的电商接口
     * @param o
     * @param product
     */
    @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 TaoBaoOrJingDongTest {
    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");
    }
}

中间我隔离出来的代码也就是这一段

		observable.addObserver(taoBaoObserver);
        observable.addObserver(jingDongObserver);

这是对被观察者注册观察者,这样才能让观察者监控到被观察者的变化情况,而他的运行结果则是

产品列表新增了产品:新增产品1
发送心产品【新增产品1】同步到京东商城
发送心产品【"+newProduct+"】同步到淘宝商城

也就是说以后在产品列表中发布新的商品,观察者们都可以出发对应的行为了,就不会出现if语句的各类的问题了,也更加的易于维护了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶懿

你的鼓励是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值