java观察者模式例子

观察者模式:

是一种常用的设计模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,它的所有观察者都会收到通知并且自动更新。

在观察者模式中,主题对象通常被称为“被观察者”(Observable)或 “主体” (Subject),而观察者对象通常被称为“观察者”(Observer)或 “订阅者”(Subscriber)。主题对象维护一个观察者列表,当它的状态发生变化时,会遍历这个列表并通知所有的观察者。

观察者模式的优点:

  • 解耦性:

观察者模式将主题对象和观察者对象解耦,它们之间只依赖于抽象接口,而不是具体的实现。

  • 可扩展性:

可以通过添加新的观察者对象来扩展系统,而不需要修改主题的代码。

  • 灵活性

观察者模式可以在运行时动态地添加或删除观察者对象,使得系统更加灵活。

观察者模式java示例

在现实生活中,我们经常会从手机、电脑、电视等途径关注天气。假设有一个气象站,它会定期更新当前的天气情况,并且希望通知所有的观察者(比如手机端、电视端、网站端等)。

首先我们定义一个主题接口Subject,它包含添加、删除和通知观察者的方法:

package com.obser;

/**
 * @author evanYang
 * @since 2023/6/6 2:34 PM
 */
public interface Subject {
    void registerObserver(Observer observer);
    void removeOberver(Observer observer);
    void notifyObserver();
}

接下来,我们定义一个具体的主题类 WeatherData,它实现了 Subject 接口,并且包含了当前天气情况的数据:

package com.obser;

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

/**
 * @author evanYang
 * @since 2023/6/6 2:41 PM
 */
public class WeatherData implements Subject{
    private float temperature;
    private float humidity;
    private float pressure;

    private List<Observer> observers;

    public WeatherData() {
        this.observers = new ArrayList<>();
    }

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

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

    @Override
    public void removeOberver(Observer observer) {
        observers.remove(observer);
    }

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

其中,WeatherData 类维护了一个观察者列表 observers,并且在数据发生变化时调用 notifyObservers() 方法通知所有观察者。

接下来,我们定义一个观察者接口 Observer,它包含了一个更新方法 update():

package com.obser;

/**
 * @author evanYang
 * @since 2023/6/6 2:35 PM
 */
public interface Observer {

    void update(float temperature,float humidity,float pressure);
}

最后,我们定义一个具体的观察者类 PhoneDisplay,它实现了 Observer 接口,并且在接收到通知后更新显示:

package com.obser;

/**
 * @author evanYang
 * @since 2023/6/6 2:48 PM
 */
public class PhoneDisplay implements Observer{
    private float temperature;
    private float humidity;
    private float pressure;
    @Override
    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("currency conditions: "+ temperature + "F degress and " + humidity + "%humidity and "
            + pressure + "Pa pressure"  );
    }
}

现在,我们可以创建一个 WeatherData 对象,并且添加一个 PhoneDisplay 观察者,然后模拟天气数据的变化:

package com.obser;

/**
 * @author evanYang
 * @since 2023/6/6 2:52 PM
 */
public class MainDemo {

    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        PhoneDisplay display = new PhoneDisplay();
        weatherData.registerObserver(display);

        weatherData.setMeasurements(80,20,33);
        weatherData.setMeasurements(50,22,11);
        weatherData.setMeasurements(66,22,11);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个简单的 Java 观察者模式例子如下: 首先,定义一个主题接口 Subject,包含注册观察者、移除观察者和通知观察者的方法: ``` public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } ``` 然后,定义一个观察者接口 Observer,包含更新方法: ``` public interface Observer { void update(String message); } ``` 接下来,实现具体的主题类 ConcreteSubject,继承自 Subject 接口,包含一个观察者列表和一个状态: ``` public class ConcreteSubject implements Subject { private List<Observer> observers; private String state; public ConcreteSubject() { observers = new ArrayList<>(); } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(state); } } public void setState(String state) { this.state = state; notifyObservers(); } } ``` 最后,实现具体的观察者类 ConcreteObserver,继承自 Observer 接口,实现更新方法: ``` public class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } @Override public void update(String message) { System.out.println(name + " received message: " + message); } } ``` 使用示例: ``` ConcreteSubject subject = new ConcreteSubject(); Observer observer1 = new ConcreteObserver("Observer 1"); Observer observer2 = new ConcreteObserver("Observer 2"); subject.registerObserver(observer1); subject.registerObserver(observer2); subject.setState("Hello World!"); subject.removeObserver(observer1); subject.setState("Goodbye World!"); ``` 输出结果: ``` Observer 1 received message: Hello World! Observer 2 received message: Hello World! Observer 2 received message: Goodbye World! ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值