设计模式-观察者模式
发布日期:2021-05-26 06:27:20 浏览次数:26 分类:精选文章

本文共 3894 字,大约阅读时间需要 12 分钟。

观察者模式应用设计

项目背景

在一个天气预报项目中,我们需要满足以下特定需求:

  • 数据发布:气象站可以将测量的温度、湿度、气压等数据以公告形式发布到自己的网站或第三方平台。
  • 开放型API设计:让其他第三方可以接入气象站获取数据。
  • 实时通知:当测量数据更新时,需要实时通知注册的第三方。
  • 传统解决方案的局限

    传统的解决方案通常采用直接调用接口的方式,即当数据更新时,直接通知所有接入方。这存在以下问题:

  • 紧耦合:气象站的业务逻辑直接与接入方绑定,移除一个接入方会导致安全隐患。
  • 难以扩展:如果更多第三方需要接入,需要为每个新接入方增加新的接口,系统复杂度增加。
  • 单向通知:接入方无法通过回调机制主动获取最新数据。
  • 这种设计方式难以在系统扩展或第三方增加时灵活应对,且信息传递方向单向,效率较低。

    观察者模式设计

    观察者模式原理

    观察者模式是一种发布-订阅模式,核心思想是:

    • 中心对象(主权对象):发布事件。
    • 观察者对象:注册自己的回调方法,接收中心对象发布的事件。
    • 通知机制:当事件发生时,主权对象遍历所有注册的观察者,调用它们的回调方法。

    这种设计方式具有以下优点:

  • 解耦:中心对象和观察者之间松耦合,中心对象只需要通知所有注册的观察者即可。
  • 可扩展性强:新接入方只需实现观察者接口并注册即可,系统架构可随需求扩展。
  • 双向通信:观察者可以主动获取最新数据,适合实时数据同步需求。
  • 类图设计

    系统主要由以下角色组成:

  • 中心对象(WeatherData):管理天气数据并通知所有注册的观察者。
  • 观察者(CurrentConditions、BaiduSite等):实现对数据变化的响应逻辑。
  • 观察者接口:定义了观察者需要实现的方法,确保不同类型的观察者可以统一处理数据变化。
  • 代码实现详解

    接口定义

    package com.atguigu.observer.improve;public interface Subject {    public void registerObserver(Observer o);    public void removeObserver(Observer o);    public void notifyObservers();}
    package com.atguigu.observer.improve;public interface Observer {    public void update(float temperature, float pressure, float humidity);}

    核心实现

    package com.atguigu.observer.improve;public class WeatherData implements Subject {    private float temperature;    private float pressure;    private float humidity;    private ArrayList
    observers; public WeatherData() { observers = new ArrayList<>(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { if (observers.contains(o)) { observers.remove(o); } } public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer = observers.get(i); observer.update(temperature, pressure, humidity); } } public void setData(float tmp, float pr, float hu) { temperature = tmp; pressure = pr; humidity = hu; notifyObservers(); }}

    观察者类

    package com.atguigu.observer.improve;public class CurrentConditions implements Observer {    private float temperature;    private float pressure;    private float humidity;    public void update(float tmp, float pr, float hu) {        temperature = tmp;        pressure = pr;        humidity = hu;        display();    }    public void display() {        System.out.println("***Today mTemperature: " + temperature + "***");        System.out.println("***Today m Pressure: " + pressure + "***");        System.out.println("***Today mHumidity: " + humidity + "***");    }}
    package com.atguigu.observer.improve;public class BaiduSite implements Observer {    private float temperature;    private float pressure;    private float humidity;    public void update(float tmp, float pr, float hu) {        temperature = tmp;        pressure = pr;        humidity = hu;        display();    }    public void display() {        System.out.println("===百度网站====");        System.out.println("***百度网站 气温 : " + temperature + "***");        System.out.println("***百度网站 气压: " + pressure + "***");        System.out.println("***百度网站 湿度: " + humidity + "***");    }}

    测试类

    package com.atguigu.observer.improve;public class Client {    public static void main(String[] args) {        WeatherData weatherData = new WeatherData();        CurrentConditions currentConditions = new CurrentConditions();        BaiduSite baiduSite = new BaiduSite();        weatherData.registerObserver(currentConditions);        weatherData.registerObserver(baiduSite);        weatherData.setData(30f, 100f, 40f);        weatherData.removeObserver(currentConditions);        System.out.println("移除了当前条件的观察者");        weatherData.setData(40f, 50f, 20f);    }}

    设计优势

  • 高效性:主权对象只需要调用一个方法即可通知所有观察者,避免了逐一调用。
  • 安全性:通过注册和移除机制,确保只有授权的观察者可以接收通知。
  • 可扩展性:新类型的观察者只需实现接口,可以自由组合使用。
  • 扩散式通知:所有关注的对象都会立即接收到通知,无需正向调用。
  • 总结

    通过对传统模式的分析和观察者模式的应用,我们找到了更为灵活和高效的解决方案。这一设计模式不仅提升了系统的可维护性,也为未来可能的扩展奠定了坚实的基础。在实际应用中,观察者模式表现出色,能够满足复杂的数据同步需求。

    上一篇:处理机调度
    下一篇:英语六级选词填空技巧

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年05月04日 08时06分06秒