Java中的观察者模式是一种常见的设计模式,它允许对象(观察者)订阅另一个对象(被观察者)的状态变化,并在状态变化时自动得到通知。
核心:
观察者模式主要用于1:N的通知。当一个对象(目标对象)的状态发生变化时,它需要及时告知一系列对象(观察者对象)令他们做出响应。
通知观察者的方式:
优点:
缺点:
常见场景:
推方式实现,以广播方式发送消息所有观察者

实现步骤:
Observer.java
// 观察者接口
public interface Observer {
void update(Subject subject);
}
Subject.java
import java.util.ArrayList;
import java.util.List;
// 被观察者
public class Subject {
// 定义存储观察者的集合
private List<Observer> observerList = new ArrayList<Observer>();
// 定义状态属性
private String state;
// 注册观察者
public void registerObserver(Observer observer){
observerList.add(observer);
}
// 移除观察者
public void removeObserver(Observer observer){
observerList.remove(observer);
}
// 通知所有观察者
public void notifyObservers(){
for(Observer observer : observerList){
observer.update(this);
}
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
notifyObservers();
}
}
ObserverA.java
// 观察者A
public class ObserverA implements Observer{
@Override
public void update(Subject subject) {
System.out.printf("观察者A接收到消息-state:%s%n",subject.getState());
}
}
ObserverB.java
// 观察者B
public class ObserverB implements Observer{
@Override
public void update(Subject subject) {
System.out.printf("观察者B接收到消息-state:%s%n",subject.getState());
}
}
TestClient.java
public class TestClient {
public static void main(String[] args) {
Subject subject = new Subject();
subject.registerObserver(new ObserverA());
subject.registerObserver(new ObserverB());
subject.setState("START");
}
}
执行结果:

使用java.util提供的Observable,Observer类实现案例1。
该方式已在1.9版本中移除,不再推荐使用
ConcreteSubject.java
import java.util.Observable;
// 目标对象
public class ConcreteSubject extends Observable {
private String state;
public void setState(String state) {
this.state = state;
// 表示目标对象已被改变
setChanged();
// 通知所有观察者
notifyObservers();
}
public String getState() {
return state;
}
}
ObserverA.java
import java.util.Observable;
import java.util.Observer;
/**
* 观察者A
*
* @author Anna.
* @date 2024/4/25 16:15
*/
public class ObserverA implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.printf("观察者A接收到消息-state:%s%n", ((ConcreteSubject) o).getState());
}
}
ObserverB.java
import java.util.Observable;
import java.util.Observer;
// 观察者B
public class ObserverB implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.printf("观察者B接收到消息-state:%s%n", ((ConcreteSubject) o).getState());
}
}
TestClient.java
public class TestClient {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
subject.addObserver(new ObserverA());
subject.addObserver(new ObserverB());
subject.setState("STOP");
}
}
执行结果:

通过拉方式,实现观察者主动拉取被观察者当前状态

实现步骤:
Subject.java
// 被观察者
public class Subject {
// 定义当前状态
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
Observer.java
// 观察者接口
public interface Observer {
// 定义拉取信息的接口
void update();
}
ConcreteObserver.java
// 观察者具体实现
public class ConcreteObserver implements Observer {
// 定义被观察者,持有被观察者的引用
private Subject subject;
public ConcreteObserver(Subject subject) {
this.subject = subject;
}
@Override
public void update() {
System.out.printf("观察者主动拉取状态-state:%s%n ", subject.getState());
}
}
TestClient.java
public class TestClient {
public static void main(String[] args) {
// 创建被观察者
Subject subject = new Subject();
// 创建观察者
ConcreteObserver observer = new ConcreteObserver(subject);
// 修改状态
subject.setState("RUN");
// 观察者主动拉取
observer.update();
}
}
执行结果:
