观察者模式在JAVA中的详细介绍

观察者模式是一种设计模式,它允许对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在JAVA中,观察者模式是通过Observable类和Observer接口来实现的。

一、观察者模式的组成

观察者模式主要由以下四个角色组成:

  1. 主题(Subject):被观察的对象,它维护了一个观察者列表,并提供注册和注销观察者的方法,同时当自身状态发生改变时,会通知所有观察者。

  2. 观察者(Observer):观察主题的对象,当主题状态发生改变时,观察者会自动更新。

  3. 具体主题(ConcreteSubject):主题的具体实现类,它实现了通知观察者的方法。

  4. 具体观察者(ConcreteObserver):观察者的具体实现类,它实现了更新方法。

二、JAVA中的观察者模式实现

在JAVA中,java.util.Observable类和java.util.Observer接口提供了观察者模式的基本实现。其中,Observable类代表主题,Observer接口代表观察者。

1. Observable类

Observable类维护了一个观察者列表,并提供以下方法:

  • void addObserver(Observer o): 注册观察者。

  • void deleteObserver(Observer o): 注销观察者。

  • void notifyObservers(): 通知所有观察者。

2. Observer接口

Observer接口定义了一个更新方法:

  • void update(Observable o, Object arg): 当主题状态发生改变时,该方法会被调用。

3. 具体实现

下面是一个简单的例子,展示了如何在JAVA中使用观察者模式:

import java.util.Observable;
import java.util.Observer;

public class ObserverPatternExample {
    public static void main(String[] args) {
        // 创建主题对象
        ConcreteSubject subject = new ConcreteSubject();
        // 创建观察者对象
        Observer observer1 = new ConcreteObserver("观察者1");
        Observer observer2 = new ConcreteObserver("观察者2");
        // 注册观察者
        subject.addObserver(observer1);
        subject.addObserver(observer2);
        // 改变主题状态并通知观察者
        subject.setState("新状态");
    }
}

class ConcreteSubject extends Observable {
    private String state;
    public String getState() { return state; }
    public void setState(String state) {
        this.state = state;
        // 通知所有观察者
        setChanged(); // 标记状态已改变
        notifyObservers(); // 通知观察者
    }
}

class ConcreteObserver implements Observer {
    private String name;
    public ConcreteObserver(String name) { this.name = name; }
    public void update(Observable o, Object arg) {
        ConcreteSubject subject = (ConcreteSubject)o;
        System.out.println(name + "收到通知,主题状态已改变为:" + subject.getState());
    }
}

在这个例子中,我们创建了一个具体主题ConcreteSubject和一个具体观察者ConcreteObserver。当主题状态发生改变时,所有注册的观察者都会收到通知并自动更新。