概述
- 描述:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
- 试用场景:
- 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变
- 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节
实现
// 主题类
public abstract class Subject {
List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeobservers(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String state) {
for (Observer observer : observers) {
observer.update(state);
}
}
}
class ConcreteSubject extends Subject {
private String state;
public ConcreteSubject(String state) {
this.state = state;
}
public void change(String state) {
this.state = state;
System.out.println("change state: " + this.state);
notifyObservers(state);
}
}
// 观察者类
public interface Observer {
void update(String state);
}
class ConcreteObserver implements Observer {
private String state;
@Override
public void update(String state) {
this.state = state;
System.out.println(this + " update state: " + this.state);
}
}
// 客户端
public class Client {
public static void main(String[] args) throws Exception {
ConcreteSubject s = new ConcreteSubject("hello");
Observer ob1 = new ConcreteObserver();
Observer ob2 = new ConcreteObserver();
s.addObserver(ob1);
s.addObserver(ob2);
s.change("world");
}
}
通过观察者模式,松散了观察者和被观察者之间的耦合,轻松的将一个对象的变化通知给多个对象。另外JDK中提供了Observable类,观察者类只需实现java.util.Observer接口即可使用观察者模式
实际应用
java事件监听,java.util.EventListener
事件监听管理类相当于主题类,它持有一个事件监听器列表,当某一事件发生时通知其列表中的所有监听器
事件监听器相当于观察者类,根据主题类状态的改变执行某些动作