结构图
模式说明
客户端
类设计
模式说明
- 扩展点在每个具体主题Subject的状态控制,具体观察者Observer的更新操作。
- 抽象Subject中保存有抽象Observer的一个集合,而每个具体Observer则持有一个具体Subject的引用。
- 客户端需要知道使用具体哪个Subject描述状态和具体哪个Observer来更新操作。
- 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
客户端
public static void main(String[] args) {
ConcreteSubject cs = new ConcreteSubject();
cs.attach(new ConcreteObserver("X", cs));
cs.attach(new ConcreteObserver("Y", cs));
cs.attach(new ConcreteObserver("Z", cs));
cs.setState("Changed");
cs.notifyObservers();
}
类设计
public interface Observer {
public void update();
}
public abstract class Subject {
private List<Observer> observers = new ArrayList<Observer>();
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();
}
}
}
public class ConcreteSubject extends Subject {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
public class ConcreteObserver implements Observer {
private String name;
private ConcreteSubject subject;
public ConcreteObserver(String name, ConcreteSubject subject) {
this.name = name;
this.subject = subject;
}
@Override
public void update() {
System.out.println("observer " + name + ", subject state is "
+ subject.getState());
}
}