观察者模式又称发布-订阅 (Publish/Subscribe)模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
感觉书上写的有点累赘,我重写了一下结构。
package observer; import java.util.ArrayList; /** * 被观察者接口,或称通知者。 * */ public class Subject { // 用ArrayList 维护一对多的映射关系 private ArrayList<Observer> observerList = new ArrayList<Observer>(); // 被观察者状态 private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; System.out.println("ConcreteSubject setSubjectState:" + subjectState); inform(); } public void add(Observer observer) { observerList.add(observer); } public void remove(Observer observer) { observerList.remove(observer); } // 通知 public void inform() { for (Observer observer : observerList) { observer.update(this); } } }
package observer; /** * 抽象观察者类,在的到通知时更新自己。 */ public abstract class Observer { public abstract void update(Subject Subject); }
package observer; /** * 通知者具体实现类 * */ public class ConcreteSubject extends Subject { }
package observer; public class ConcreteObserver extends Observer { private String name; private String observerState; public ConcreteObserver(String name) { super(); this.name = name; } @Override public void update(Subject Subject) { // 意思应该是省略了,根据通知者状态做出的观察者状态 observerState = Subject.getSubjectState(); System.out.println("Observer:" + name + " observerState:" + observerState); } public static void main(String[] args) { ConcreteSubject concreteSubject=new ConcreteSubject(); concreteSubject.add(new ConcreteObserver("A")); concreteSubject.add(new ConcreteObserver("B")); concreteSubject.setSubjectState("ABC"); } }
不足之处,Subject 还是依赖Observer,而Observer没有相应的update接口,或者相应的update名字不相同的时候,inform的功能完成不了。
实现能动态的根据updata方法来实现inform。这里用到了事件委托。
委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样具有参数和返回值。委托可以看作是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。
委托对象所搭载的所有方法必须具有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。
http://www.iteye.com/topic/29541