观察者模式在JAVA中的详细介绍 {#%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F%E5%9C%A8java%E4%B8%AD%E7%9A%84%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D}
观察者模式是一种设计模式,它允许对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在JAVA中,观察者模式是通过Observable
类和Observer
接口来实现的。
一、观察者模式的组成 {#%E4%B8%80%E3%80%81%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F%E7%9A%84%E7%BB%84%E6%88%90}
观察者模式主要由以下四个角色组成:
-
主题(Subject):被观察的对象,它维护了一个观察者列表,并提供注册和注销观察者的方法,同时当自身状态发生改变时,会通知所有观察者。
-
观察者(Observer):观察主题的对象,当主题状态发生改变时,观察者会自动更新。
-
具体主题(ConcreteSubject):主题的具体实现类,它实现了通知观察者的方法。
-
具体观察者(ConcreteObserver):观察者的具体实现类,它实现了更新方法。
二、JAVA中的观察者模式实现 {#%E4%BA%8C%E3%80%81java%E4%B8%AD%E7%9A%84%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F%E5%AE%9E%E7%8E%B0}
在JAVA中,java.util.Observable
类和java.util.Observer
接口提供了观察者模式的基本实现。其中,Observable
类代表主题,Observer
接口代表观察者。
1. Observable类 {#1.-observable%E7%B1%BB}
Observable
类维护了一个观察者列表,并提供以下方法:
-
void addObserver(Observer o)
: 注册观察者。 -
void deleteObserver(Observer o)
: 注销观察者。 -
void notifyObservers()
: 通知所有观察者。
2. Observer接口 {#2.-observer%E6%8E%A5%E5%8F%A3}
Observer
接口定义了一个更新方法:
void update(Observable o, Object arg)
: 当主题状态发生改变时,该方法会被调用。
3. 具体实现 {#3.-%E5%85%B7%E4%BD%93%E5%AE%9E%E7%8E%B0}
下面是一个简单的例子,展示了如何在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
。当主题状态发生改变时,所有注册的观察者都会收到通知并自动更新。