java观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,会通知所有观察者,使它们能够自动更新自己的状态。

观察者模式的角色和实现:

  1. 主题(Subject)

    • 主题对象维护一个观察者列表,并提供方法来增加或删除观察者。
    • 当主题状态发生变化时,会通知所有注册的观察者。
  2. 观察者(Observer)

    • 观察者定义了一个更新接口,用于在主题状态发生变化时接收通知和更新自身状态。
  3. 具体主题(Concrete Subject)

    • 具体主题是主题的具体实现,维护着自己的状态。
    • 当状态变化时,负责通知所有注册的观察者。
  4. 具体观察者(Concrete Observer)

    • 具体观察者实现了观察者接口,在接收到主题的通知时执行具体的更新操作。

示例代码演示:

1. 创建主题接口和观察者接口:
// 主题接口
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 观察者接口
public interface Observer {
    void update(String message);
}
2. 创建具体主题和具体观察者类:
import java.util.ArrayList;
import java.util.List;

// 具体主题实现
public class WeatherStation implements Subject {
    private List<Observer> observers;
    private String weatherMessage;

    public WeatherStation() {
        this.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(weatherMessage);
        }
    }

    public void setWeatherMessage(String weatherMessage) {
        this.weatherMessage = weatherMessage;
        notifyObservers(); // 通知观察者状态更新
    }
}

// 具体观察者实现
public class PhoneDisplay implements Observer {
    private String weatherMessage;

    @Override
    public void update(String message) {
        this.weatherMessage = message;
        display();
    }

    public void display() {
        System.out.println("Phone Display: " + weatherMessage);
    }
}
3. 客户端代码演示观察者模式的应用:
public class Main {
    public static void main(String[] args) {
        WeatherStation weatherStation = new WeatherStation();

        // 创建具体观察者
        PhoneDisplay phoneDisplay = new PhoneDisplay();

        // 注册观察者
        weatherStation.registerObserver(phoneDisplay);

        // 模拟天气更新,并通知观察者
        weatherStation.setWeatherMessage("Today is sunny");

        // 如果需要,可以注销观察者
        // weatherStation.removeObserver(phoneDisplay);
    }
}
输出结果:
Phone Display: Today is sunny

在这个例子中:

  • WeatherStation 类实现了 Subject 接口,维护一个观察者列表,并负责通知观察者状态变化。
  • PhoneDisplay 类实现了 Observer 接口,具体实现了在收到通知时如何更新和显示信息。
  • Main 类中,创建了 WeatherStationPhoneDisplay 对象,注册观察者并模拟天气更新,观察者接收到通知后更新并显示最新的天气信息。

观察者模式非常有用,特别是在需要一对多通知的场景,如事件处理、GUI 界面更新、分布式系统中的状态同步等。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java观察者模式是一种常见的设计模式,用于在对象之间建立一对多的依赖关系[^1]。在该模式中,有一个主题(被观察者)和多个观察者。当主题的状态发生变化时,它会通知所有的观察者进行相应的更新。 下面是一个Java观察者模式的示例代码: ```java // 定义观察者接口 public interface Observer { void update(); } // 定义具体的观察者类 public class ConcreteObserver implements Observer { private int observerState; private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject) { this.subject = subject; this.subject.registerObserver(this); } @Override public void update() { observerState = subject.getState(); System.out.println("Observer state updated: " + observerState); } } // 定义主题接口 public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } // 定义具体的主题类 public class ConcreteSubject implements Subject { private int state; private List<Observer> observers = new ArrayList<>(); public int getState() { return state; } public void setState(int state) { this.state = state; notifyObservers(); } @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(); } } } // 使用观察者模式 public class Main { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver(subject); ConcreteObserver observer2 = new ConcreteObserver(subject); subject.setState(10); // 输出: // Observer state updated: 10 // Observer state updated: 10 subject.setState(20); // 输出: // Observer state updated: 20 // Observer state updated: 20 } } ``` 在上面的示例中,`ConcreteSubject`是具体的主题类,它维护了一个观察者列表,并在自身状态发生变化时通知所有观察者进行更新。`ConcreteObserver`是具体的观察者类,它实现了`Observer`接口,并在`update`方法中更新自己的状态。 使用观察者模式可以实现对象之间的松耦合,当一个对象的状态发生变化时,不需要直接调用其他对象的方法,而是通过观察者模式来通知其他对象进行更新。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超维Ai编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值