定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自己更新自己。
类图

实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import java.util.ArrayList; import java.util.List;
public abstract class Subject {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) { observers.add(observer); }
public void detach(Observer observer) { observers.remove(observer); }
public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } }
|
1 2 3 4 5
| public abstract class Observer {
public abstract void update();
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class ConcreteSubject extends Subject {
private String subjectState;
public String getSubjectState() { return subjectState; }
public void setSubjectState(String subjectState) { this.subjectState = subjectState; }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class ConcreteObserver extends Observer {
private String name; private ConcreteSubject concreteSubject;
public ConcreteObserver(ConcreteSubject concreteSubject, String name) { this.name = name; this.concreteSubject = concreteSubject; this.concreteSubject.attach(this); }
@Override public void update() { System.out.println("观察者" + name + "获取的主题状态是:" + concreteSubject.getSubjectState()); }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class Client {
public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver(subject, "X"); ConcreteObserver observer2 = new ConcreteObserver(subject, "Y"); ConcreteObserver observer3 = new ConcreteObserver(subject, "Z");
subject.setSubjectState("A"); subject.notifyObservers();
subject.detach(observer2); subject.setSubjectState("B"); subject.notifyObservers(); }
}
|