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日

相关文章

  • Win10专业版用户电脑开机没几分钟自动重启的解决方法

    Win10专业版用户电脑开机没几分钟自动重启的解决方法 在使用Win10专业版的过程中,有时电脑开机后没几分钟就自动重启,给用户带来了很大的不便。此时我们可以通过以下方法进行解决。 方法一:关闭自动重启 首先,我们可以尝试关闭系统自动重启的功能。 打开开始菜单,点击“设置”图标。 在“设置”窗口中,点击“更新和安全”选项。 在“更新和安全”窗口中,点击“恢复…

    other 2023年6月27日
    00
  • Nginx下301重定向域名的方法小结

    那我来为你详细讲解一下“Nginx下301重定向域名的方法小结”的完整攻略。 1. 确认需求 首先,在进行任何操作之前,我们需要确认一下具体的需求。例如该网站想要将所有以“example.com”为域名的访问请求都重定向到“www.example.com”,那么我们就需要进行301永久重定向。确认完需求后,我们就可以继续操作了。 2. 在Nginx服务器中添…

    other 2023年6月27日
    00
  • Java编程实现递增排序链表的合并

    要实现递增排序链表的合并,可以采用归并排序的思想:将两个已经排好序的链表合并成一个更大的有序链表。 步骤如下: 首先,判断两个链表是否为空,若有一个为空,则返回另一个链表。 然后,比较两个链表的头结点的值,将值小的头结点作为新链表的头结点。 接着,递归地对剩余的部分进行合并,将小的节点插入到新链表的末尾。 下面是Java代码实现: public class …

    other 2023年6月27日
    00
  • 如何一键取消ppt动画效果一键取消ppt动画效果的方法

    以下是关于“如何一键取消PPT动画效果”的完整攻略,包括基本概念、解决方法、示例说明和注意事项。 基本概念 PPT动效果是指在PPT中添加的各种动画效果,如淡入淡出、飞入飞出、旋转等。这些动画效果可以使PPT更加生动、有趣,但有时也会影响PPT的展示效果。因此,有时需要一键取消PPT动画效果。 解决方法 以下是一键取消PPT动画效果的方法: 打开PPT 打开…

    other 2023年5月7日
    00
  • C++类继承之子类调用父类的构造函数的实例详解

    C++类继承之子类调用父类的构造函数的实例详解 在C++的类继承中,派生类可以通过调用基类的构造函数来完成对基类部分的初始化,这个过程叫做子类调用父类的构造函数。本文将会详细讲解如何在C++继承中实现子类调用父类的构造函数,包括示例说明和实际应用场景。 子类如何调用父类的构造函数 子类调用父类的构造函数一般通过子类的初始化列表来完成。子类初始化列表中使用基类…

    other 2023年6月26日
    00
  • Linux磁盘挂载、分区、扩容操作的实现方法

    下面是关于“Linux磁盘挂载、分区、扩容操作的实现方法”的完整攻略,内容包括如何分区、挂载、扩容等。 分区 在Linux中,硬盘的分区非常重要,它可以将一个大的硬盘划分成多个独立的区域,每个区域有自己的用途。下面介绍一个基本的硬盘分区命令fdisk,可以用来对硬盘进行分区。 首先使用fdisk命令查看当前系统中的硬盘: fdisk -l 该命令会显示当前系…

    other 2023年6月27日
    00
  • 电脑鼠标左右键如何切换

    电脑鼠标左右键如何切换主要是指在使用鼠标时,如何切换鼠标的左右按键功能。在Windows系统中,默认情况下,鼠标左键用于选中和执行任务,而鼠标右键用于打开快捷菜单。但是,有时候需要我们将左右键功能进行切换,比如针对左撇子用户。 下面是详细的攻略: 方法一:更改鼠标底部按钮设置 首先,打开“控制面板”,然后找到“硬件和声音”选项 在“设备和打印机”下找到鼠标,…

    other 2023年6月27日
    00
  • FreeRTOS实时操作系统在Cortex-M3上的移植过程

    FreeRTOS实时操作系统是一种轻量级、开源的实时操作系统,它可以轻松地移植到各种不同的硬件平台上。本文将构建一个基于Cortex-M3的移植环境,演示了FreeRTOS移植的详细步骤。 准备工作 在开始移植之前,请确保以下几项准备工作已经完成: 确定你的目标板型号。 准备一份适用于你的目标板的FreeRTOS代码。 下载并安装适用于你的目标板的Corte…

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