定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。
观察者模式是一种发布-订阅模式。它让发送通知的一方(被观察者)和接收通知的一方(观察者)能够解耦,实现了对象之间的松耦合。
观察者模式的核心角色。
- Subject(主题/被观察者):维护观察者列表,提供添加、删除观察者的方法,以及通知观察者的方法。
- Observer(观察者):定义一个更新接口,用于在主题状态改变时接收通知。
- ConcreteSubject(具体主题):实现主题接口,存储具体状态,当状态改变时通知所有观察者。
- ConcreteObserver(具体观察者):实现观察者接口,维护一个指向具体主题的引用,存储与主题相关的状态。
下面是一个完整的观察者模式 Demo。
定义观察者接口。
java
public interface Observer {
void update(String message);
}
定义主题接口。
java
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(String message);
}
实现具体主题。
java
import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
public void changeState(String newState) {
System.out.println("Subject state changed to: " + newState);
notifyObservers(newState);
}
}
实现具体观察者。
java
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received message: " + message);
}
}
执行测试代码,输出结果。
java
public class ObserverPatternDemo {
public static void main(String[] args) {
// 创建主题
ConcreteSubject subject = new ConcreteSubject();
// 创建观察者
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
Observer observer3 = new ConcreteObserver("Observer 3");
// 注册观察者
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.registerObserver(observer3);
// 改变主题状态,观察者会收到通知
subject.changeState("State 1");
// 移除一个观察者
subject.removeObserver(observer2);
// 再次改变状态
subject.changeState("State 2");
}
}
可以看到,只要主题类发生变更,依赖于它的观察者都会收到通知并进行相应的更新。
总结
观察者模式。将主题和观察者解耦,实现了对象之间的松耦合。是一种一对多的通知机制,使得双方无需关心对方,只关心通知本身。