观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象再状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。我们来看一个老板来了,由秘书通知同事放下手头的事继续工作的小例子。
1、通知者类,包括添加观察者、删除观察者、通知以及通知的内容设置和获取。
public interface Subject { public void attach(Observer observer); public void detach(Observer observer); public void notifyObserver(); public String getSubjectState(); public void setSubjectState(String action); }2、秘书类实现通知者类
public class Secretary implements Subject{ private List<Observer> observers = new ArrayList<Observer>(); private String action; @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void notifyObserver() { for(Observer observer:observers){ observer.update(); } } @Override public String getSubjectState() { return action; } @Override public void setSubjectState(String action) { this.action = action; } }3、抽象观察者类包括姓名、监听主题和更新方法
public abstract class Observer { protected String name; protected Subject sub; public Observer(String name,Subject sub){ this.name = name; this.sub = sub; } public abstract void update(); }4、同事类继承观察者类,可以是多个同事
public class StockObserver extends Observer{ public StockObserver(String name, Subject sub) { super(name, sub); } @Override public void update() { System.out.println(sub.getSubjectState()+","+name+"关闭股票行情,继续工作!"); } }5、测试
public class Test { public static void main(String[] args) { // 实例化通知者 Secretary secretary = new Secretary(); // 实例化观察者 StockObserver tongshi = new StockObserver("小明",secretary); // 添加观察者 secretary.attach(tongshi); // 设置通知状态 secretary.setSubjectState("老板回来啦"); // 通知同事老板回来了 secretary.notifyObserver(); } }