Java设计模式(19):观察者模式

19,观察者模式(Observer)

19.1,问题引入_天气预报问题

  • 气象站可以将每天测量到的温度、湿度、气压等发布出去,发布到自己的页面或者第三方系统
  • 发布的形式可以采用两种方式:修改数据等待获取和直接数据推送
  • 在进行数据推送时,需要明确对端系统,然后在变更时调用对端接口进行数据修改
  • 对端系统肯定是不确定多个,并且随时可能存在增减,如何对多系统进行管理,并进行数据推送,可以使用观察者模式

19.2,基本介绍

  • 观察者模式(Observer Pattern):是解决对象间关系一对多依赖的一种设计方案。被依赖的对象为 Subject,为1的一方;依赖对象为 Observer,是多的一方;
  • Subject 提供对 Observer 的管理方式和消息通知,由 Observer 进行自定义数据变更
  • Observer 需要按规则定义统一的数据修改方式,在 Subject 调用通知后,能进行数据变更通知

19.3,类图

在这里插入图片描述

  • Subject:顶层发布者接口,提供观察者的订阅、去订阅和通知接口
  • SubjectImpl:具体发布者实现类,除实现订阅、去订阅和通知接口外,单独提供对应的数据修改接口,修改完成后进行观察者通知
  • Observer:顶层观察者接口,提供统一的数据修改方式
  • XXXObserver:具体观察者类,实现自定义数据修改方式

19.4,代码实现

  • Subject:顶层发布者接口

    package com.self.designmode.observer;
    
    /**
     * 观察者模式_信息发布者顶层接口
     * @author PJ_ZHANG
     * @create 2020-12-16 16:09
     **/
    public interface Subject {
    
        void addObserver(Observer observer);
    
        void removeObserver(Observer observer);
    
        void notifyObserver();
    
    }
    
  • SubjectImpl:具体发布者

    package com.self.designmode.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 发布者具体实现类, 进行观察者注册和通知
     * @author PJ_ZHANG
     * @create 2020-12-16 16:15
     **/
    public class SubjectImpl implements Subject {
    
        // 温度
        private double temperature;
    
        // 湿度
        private double humidity;
    
        // 气压
        private double pressure;
    
        // 观察者集合
        private List<Observer> lstObserver = new ArrayList<>(10);
    
        // 添加观察者
        @Override
        public void addObserver(Observer observer) {
            lstObserver.add(observer);
        }
    
        // 移除观察者
        @Override
        public void removeObserver(Observer observer) {
            lstObserver.remove(observer);
        }
    
        @Override
        public void notifyObserver() {
            // 遍历每一个观察者, 进行数据通知
            for (Observer observer : lstObserver) {
                observer.update(temperature, humidity, pressure);
            }
        }
    
        // 发生数据变更
        public void changeData(double temperature, double humidity, double pressure) {
            // 进行数据变更
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            // 变更完成, 进行观察者通知
            notifyObserver();
        }
    
    }
    
  • Observer:顶层观察者接口

    package com.self.designmode.observer;
    
    /**
     * 观察者模式_观察者顶层接口
     * @author PJ_ZHANG
     * @create 2020-12-16 16:10
     **/
    public interface Observer {
    
        /**
         * 修改温度, 湿度, 气压
         * @param temperature
         * @param humidity
         * @param pressure
         */
        void update(double temperature, double humidity, double pressure);
    
    }
    
  • BaiDuObserver:具体观察者_百度

    package com.self.designmode.observer;
    
    /**
     * 百度接收天气数据
     * @author PJ_ZHANG
     * @create 2020-12-16 16:21
     **/
    public class BaiDuObserver implements Observer {
    
        @Override
        public void update(double temperature, double humidity, double pressure) {
            System.out.println("百度接收, 温度: " + temperature);
            System.out.println("百度接收, 湿度: " + humidity);
            System.out.println("百度接收, 气压: " + pressure);
        }
    
    }
    
  • MeiTuanObserver:具体观察者_美团

    package com.self.designmode.observer;
    
    /**
     * 美团接收天气数据
     * @author PJ_ZHANG
     * @create 2020-12-16 16:21
     **/
    public class MeiTuanObserver implements Observer {
    
        @Override
        public void update(double temperature, double humidity, double pressure) {
            System.out.println("美团接收, 温度: " + temperature);
            System.out.println("美团接收, 湿度: " + humidity);
            System.out.println("美团接收, 气压: " + pressure);
        }
    
    }
    
  • Client:客户端

    package com.self.designmode.observer;
    
    /**
     * @author PJ_ZHANG
     * @create 2020-12-16 16:22
     **/
    public class Client {
    
        public static void main(String[] args) {
            // 创建发布者
            SubjectImpl subject = new SubjectImpl();
            // 创建观察者
            Observer baiduObserver = new BaiDuObserver();
            Observer meiTuanObserver = new MeiTuanObserver();
            // 注册观察者到发布者
            subject.addObserver(baiduObserver);
            subject.addObserver(meiTuanObserver);
            // 发布者改变数据
            subject.changeData(10, 20, 40);
        }
    
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值