行为型设计模式--观察者模式(Observer)
观察者模式(Observer)
?
??? 观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
??? Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
?

?
??? Observer模式的角色:
??? 抽象主题(Subject)角色:主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;
?
??? 具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;
?
??? 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到通知时更新自己;
?
??? 具体观察者(ConcreteObserver)角色: 保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。
?
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 Notify() {for (Observer o : observers) {o.update();}}}class ConcreteSubject extends Subject {private String subjectState;public String getSubjectState() {return subjectState;}public void setSubjectState(String subjectState) {this.subjectState = subjectState;}}interface Observer {public void update();}class ConcreteObserver implements Observer {private String name;private String observerState;private ConcreteSubject subject;public ConcreteSubject getSubject() {return subject;}public void setSubject(ConcreteSubject subject) {this.subject = subject;}public ConcreteObserver(ConcreteSubject subject, String name) {this.name = name;this.subject = subject;}public void update() {observerState = subject.getSubjectState();}}public class Test {public static void main(String[] args) {ConcreteSubject s = new ConcreteSubject();s.attach(new ConcreteObserver(s, "X"));s.attach(new ConcreteObserver(s, "Y"));s.attach(new ConcreteObserver(s, "Z"));s.setSubjectState("ABC");s.Notify();}}?