Java设计模式开发中使用观察者模式的实例教程

Java设计模式开发中使用观察者模式的实例教程

观察者模式是一种行为型设计模式,它允许对象之间建立一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新。在Java设计模式开发中,观察者模式被广泛应用于事件驱动系统、GUI开发和消息通知等场景。

实现观察者模式的基本步骤

  1. 定义主题接口(Subject):主题是被观察的对象,它需要提供注册观察者、移除观察者和通知观察者的方法。
  2. 实现具体主题类(ConcreteSubject):具体主题类实现主题接口,维护一个观察者列表,并在状态发生变化时通知观察者。
  3. 定义观察者接口(Observer):观察者是接收主题通知的对象,它需要提供更新方法。
  4. 实现具体观察者类(ConcreteObserver):具体观察者类实现观察者接口,当接收到主题通知时执行相应的更新操作。

示例1:气象站

假设我们正在开发一个气象站应用程序,需要实时显示当前的温度、湿度和气压。我们可以使用观察者模式来实现这个功能。

首先,我们定义主题接口(Subject):

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

然后,实现具体主题类(WeatherStation):

import java.util.ArrayList;
import java.util.List;

public class WeatherStation implements Subject {
    private List<Observer> observers;
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherStation() {
        observers = new ArrayList<>();
    }

    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature, humidity, pressure);
        }
    }

    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        notifyObservers();
    }
}

接下来,定义观察者接口(Observer):

public interface Observer {
    void update(float temperature, float humidity, float pressure);
}

最后,实现具体观察者类(Display):

public class Display implements Observer {
    private float temperature;
    private float humidity;
    private float pressure;

    public void update(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        display();
    }

    public void display() {
        System.out.println(\"Current conditions: \" + temperature + \"F degrees, \" + humidity + \"% humidity, \" + pressure + \" pressure\");
    }
}

现在,我们可以使用观察者模式来创建一个气象站应用程序:

public class WeatherApp {
    public static void main(String[] args) {
        WeatherStation weatherStation = new WeatherStation();
        Display display = new Display();

        weatherStation.registerObserver(display);

        // 模拟气象数据更新
        weatherStation.setMeasurements(75, 60, 30.4f);
    }
}

运行上述代码,输出结果为:

Current conditions: 75.0F degrees, 60.0% humidity, 30.4 pressure

示例2:股票市场

假设我们正在开发一个股票市场监控系统,需要实时监测股票价格的变化并通知相关的观察者。我们可以使用观察者模式来实现这个功能。

首先,定义主题接口(Subject)和观察者接口(Observer)与示例1中相同。

然后,实现具体主题类(StockMarket):

import java.util.ArrayList;
import java.util.List;

public class StockMarket implements Subject {
    private List<Observer> observers;
    private String stockName;
    private double price;

    public StockMarket() {
        observers = new ArrayList<>();
    }

    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(stockName, price);
        }
    }

    public void setStockPrice(String stockName, double price) {
        this.stockName = stockName;
        this.price = price;
        notifyObservers();
    }
}

接下来,实现具体观察者类(Investor):

public class Investor implements Observer {
    private String name;

    public Investor(String name) {
        this.name = name;
    }

    public void update(String stockName, double price) {
        System.out.println(name + \" received update: \" + stockName + \" price is \" + price);
    }
}

最后,我们可以使用观察者模式来创建一个股票市场监控系统:

public class StockMarketApp {
    public static void main(String[] args) {
        StockMarket stockMarket = new StockMarket();
        Investor investor1 = new Investor(\"John\");
        Investor investor2 = new Investor(\"Alice\");

        stockMarket.registerObserver(investor1);
        stockMarket.registerObserver(investor2);

        // 模拟股票价格变化
        stockMarket.setStockPrice(\"AAPL\", 150.0);
    }
}

运行上述代码,输出结果为:

John received update: AAPL price is 150.0
Alice received update: AAPL price is 150.0

通过以上两个示例,我们可以看到观察者模式的应用。它可以帮助我们实现对象之间的松耦合,使得主题和观察者可以独立变化,同时也提供了一种简单的方式来实现事件驱动的系统。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式开发中使用观察者模式的实例教程 - Python技术站

(0)
上一篇 2023年7月27日
下一篇 2023年7月27日

相关文章

  • Nmap 简单功能介绍

    Nmap 简单功能介绍 Nmap是一个用于网络探测和安全审计的免费工具,可以帮助管理员识别可能存在的安全问题并进行解决。 下面我们来简单介绍一下Nmap的一些基础功能: 主机发现 主机扫描可以让用户发现当前局域网中的活动主机,同时识别该主机所使用的操作系统和开放的端口。下面是使用 Nmap 进行主机探测的命令示例: nmap -sP 192.168.0.0/…

    其他 2023年3月28日
    00
  • 详解Linux环境变量配置全攻略

    详解Linux环境变量配置全攻略 本文将详细讲解如何在Linux系统中配置环境变量。环境变量是指一些特定的变量,用于指示系统或应用程序在执行时需要使用什么样的参数、文件路径、库路径等信息。在Linux中配置环境变量可以方便我们的日常开发和操作。 1. 环境变量的基本概念 1.1 什么是环境变量 环境变量是一些系统级别的参数或变量,用于控制Linux系统中的行…

    other 2023年6月27日
    00
  • word2016替换文字时怎么区分大小写?

    当使用Word 2016替换文字时,可以通过以下步骤区分大小写: 打开Word 2016并打开要编辑的文档。 点击顶部菜单栏中的“编辑”选项。 在下拉菜单中选择“查找”选项,或者使用快捷键Ctrl + F打开查找对话框。 在查找对话框中,输入要查找的文字,并点击“查找下一个”按钮。 如果要区分大小写,点击查找对话框中的“更多”按钮。 在弹出的更多选项中,勾选…

    other 2023年8月16日
    00
  • c++学习(八)(c语言部分)之图形库

    下面是关于 C++ 学习(八)(C 语言部分)之图形库的完整攻略,包含两个示例说明。 图形库 在 C 语言中,你可以使用图形库来创建基本的图形界面。图形库是一个软件库,它提供了一组函数,可以用来绘制图形、文本和其他图形元素。在 Windows 系统中,你可以使用 WinAPI 来创建图形界面,在 Linux 系统中,你可以使用 X Window System…

    other 2023年5月8日
    00
  • 详解Spring中Bean的作用域与生命周期

    下面是详解Spring中Bean的作用域与生命周期的完整攻略: 一、作用域 在Spring中,Bean的作用域可以理解为Bean生命周期内存在的范围。Spring提供了五种Bean作用域,分别是:Singleton、Prototype、Request、Session和GlobalSession。 1. Singleton Singleton是Spring默认…

    other 2023年6月27日
    00
  • 探讨C语言的那些小秘密之断言

    探讨C语言的那些小秘密之断言 什么是断言 在 C 语言中,断言是一种用来检查程序是否处于正确状态的工具。它通常用于在程序的早期阶段发现并解决错误,以避免错误在程序的后续阶段造成更加严重的后果。 断言是一个宏,它接受一个布尔表达式作为参数,并检查该表达式的值是否为真。如果该表达式的值为假,断言将会输出一条错误消息,并且中断程序的执行。 在 C 语言中,断言宏定…

    other 2023年6月27日
    00
  • java获取反射机制的3种方法总结

    Java获取反射机制的3种方法总结 1. 使用Class类的forName方法 通过Class类的forName方法可以根据类的全限定名获取对应的Class对象。以下是获取Class对象的示例代码: try { // 获取Person类的Class对象 Class<?> personClass = Class.forName("com.…

    other 2023年6月28日
    00
  • DS-SDK封装ThreeJS的三维场景核心库Viewer

    DS-SDK是一个三维建模和可视化开发工具,能够帮助开发者快速完成三维场景的搭建和方案展示。其中封装的ThreeJS的三维场景核心库Viewer,是DS-SDK的重要组成部分之一,下面是该核心库的详细攻略。 1. DS-SDK封装ThreeJS的三维场景核心库Viewer DS-SDK的ThreeJS的三维场景核心库Viewer,可以快速实现三维模型导入、贴…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部