1. 概念
观察者模式是一种软件设计模式,也称为发布-订阅模式。在这种模式中,存在一个被称为主题(Subject)的对象,以及若干个观察者(Observer)对象。主题对象维护了一个观察者对象列表,当主题对象的状态发生变化时,它会通知所有的观察者对象,使它们能够自动更新。
这种模式常被用于构建分布式系统、事件处理系统以及MVC(模型-视图-控制器)架构中。它可以有效地降低组件之间的耦合性,让系统更易于扩展和维护。
在观察者模式中,主题对象通常具有以下几个核心方法:
- 注册观察者:用于向主题对象注册一个观察者对象。
- 注销观察者:用于从主题对象中注销一个观察者对象。
- 通知观察者:用于通知所有注册的观察者对象,主题对象的状态已经发生了改变。
而观察者对象则会实现一个更新方法,用于在接收到主题对象的通知后进行相应的更新操作。
这种模式的优点在于它能够提供一种松耦合的方式,使得主题对象和观察者对象能够相互独立地变化,同时也方便了系统的维护和扩展。
2.示例
import java.util.ArrayList;
import java.util.List;
// 主题接口
interface Subject {
void registerObserver(Observer observer);
void unregisterObserver(Observer observer);
void notifyObservers();
}
// 观察者接口
interface Observer {
void update();
}
// 具体主题类
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void unregisterObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
// 具体业务逻辑,当主题状态变化时调用此方法
public void stateChanged() {
// 做一些状态变化的处理
System.out.println("主题状态发生了改变!");
// 通知所有观察者
notifyObservers();
}
}
// 具体观察者类
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update() {
System.out.println(name + "收到了主题的通知,进行相应的更新操作。");
}
}
public class ObserverPatternExample {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver("观察者1");
ConcreteObserver observer2 = new ConcreteObserver("观察者2");
// 注册观察者
subject.registerObserver(observer1);
subject.registerObserver(observer2);
// 主题状态发生变化
subject.stateChanged();
// 取消注册观察者
subject.unregisterObserver(observer1);
// 主题状态再次发生变化
subject.stateChanged();
}
}
这个示例中,ConcreteSubject
类实现了Subject
接口,而ConcreteObserver
类实现了Observer
接口。当主题状态发生改变时,ConcreteSubject
会调用notifyObservers()
方法通知所有注册的观察者,观察者会调用update()
方法进行相应的更新操作。
在main
方法中,我们创建了一个具体主题对象subject
,以及两个具体观察者对象observer1
和observer2
。我们注册了这两个观察者对象,并模拟了主题状态的变化,观察者收到通知后进行相应的更新操作。