Java观察者模式

观察者模式是一种在软件开发中常用的设计模式,它用于在对象之间定义一种一对多的依赖关系,当一个对象的状态发生变化时,其所有依赖的对象都会收到通知并自动更新。

在本文中,我们将通过一个简单的Java示例来演示观察者模式的实际应用。我们将实现一个名为Subject的主题类,它维护一个包含一组观察者的列表,并提供一些方法用于添加、移除和通知观察者。我们还将创建一个名为Observer的观察者接口,它定义了一个update方法,用于在主题状态变化时更新观察者。

主题类

首先,让我们创建一个名为Subject的主题类。它包含一个observers列表,用于存储所有观察者对象,并提供一些方法用于添加、移除和通知观察者。

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

public class Subject {
    private List<Observer> observers = new ArrayList<>();
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        notifyObservers();
    }

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

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

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

在上面的代码中,我们定义了一个observers列表,它用于存储所有观察者对象。state变量用于保存主题的状态。setState方法用于设置主题的状态,并在状态变化时通知所有观察者。

attach方法用于将观察者添加到主题的观察者列表中。detach方法用于将观察者从观察者列表中移除。notifyObservers方法用于通知所有观察者更新。

观察者接口

接下来,我们将创建一个名为Observer的观察者接口。它定义了一个update方法,用于在主题状态发生变化时更新观察者。

public interface Observer {
    void update();
}

具体观察者

现在,我们将创建一个名为ConcreteObserver的具体观察者类。它实现了Observer接口,并在update方法中定义了观察者的具体行为。

public class ConcreteObserver implements Observer {

    private Subject subject;

    public ConcreteObserver(Subject subject) {
        this.subject = subject;
        subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Subject state changed: " + subject.getState());
    }
}

在上面的代码中,我们定义了一个ConcreteObserver类,它包含一个主题对象subject。在构造函数中,我们将观察者添加到主题的观察者列表中。在update方法中,我们打印出主题状态的变化。

使用观察者模式

现在,我们将使用上述代码来演示观察者模式的使用。

public class Main {
    public static void main(String[] args) {
        Subject subject = new Subject();
        ConcreteObserver observer1 = new ConcreteObserver(subject);
        ConcreteObserver observer2 = new ConcreteObserver(subject);

        subject.setState(1); // Output: Subject state changed: 1
        subject.setState(2); // Output: Subject state changed: 2

        subject.detach(observer2);
        subject.setState(3); // Output: Subject state changed: 3
    }
}

在上面的代码中,我们创建了一个主题对象subject,并创建了两个具体观察者对象observer1observer2。然后,我们通过调用setState方法来更改主题的状态。每当状态发生变化时,具体观察者都会收到通知并更新。

结论

观察者模式是一种非常有用的设计模式,它可以帮助我们在对象之间建立一种一对多的依赖关系。它使得对象之间