观察者模式在JAVA中的详细介绍
观察者模式是一种设计模式,它允许对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在JAVA中,观察者模式是通过Observable
类和Observer
接口来实现的。
一、观察者模式的组成
观察者模式主要由以下四个角色组成:
主题(Subject):被观察的对象,它维护了一个观察者列表,并提供注册和注销观察者的方法,同时当自身状态发生改变时,会通知所有观察者。
观察者(Observer):观察主题的对象,当主题状态发生改变时,观察者会自动更新。
具体主题(ConcreteSubject):主题的具体实现类,它实现了通知观察者的方法。
具体观察者(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
。当主题状态发生改变时,所有注册的观察者都会收到通知并自动更新。