观察者模式又叫发布-订阅模式。
观察者模式定义了一种一对多的关系,让多个观察者对象监听某一个主题对象。当这个主题对象状态发生变化的时候,会通知该主题对象所需要通知的观察者,使被通知到的观察者能够做出对应的改变
概括来说,观察者模式适用于当一个对象的改变需要同时改变其他对象的时候。
举个例子的话,就拿我们的Myeclipse来说,当我们在java和debug布局之间切换时,界面的组件也会发生相对应的变化。这就是观察者模式的一个典型实现。
图片截自《大话设计模式》
主题(通知类)抽象类,里面实现了增加和删除观察者,和通知所有观察者的方法。
/** * 主题(通知者)的抽象类 * @author Avalon * */ public abstract class Subject { public List<Observer> observer = new ArrayList<Observer>(); //增加观察者 public void attach(Observer observer){ this.observer.add(observer); } //删除观察者 public void detach(Observer observer){ this.observer.remove(observer); } public void notifyAllObserver(String state){ for (Observer ob: this.observer){ ob.update(state); } } }
继承了Subject的Boss类,作为通知者
public class Boss extends Subject{ private String state; public void change(String newState){ state = newState; //状态发生了改变,通知所有的观察者 this.notifyAllObserver(newState); } public String getState() { return state; } public void setState(String state) { this.state = state; } }
观察者接口
public interface Observer { public void update(String state); }
继承了观察者接口的员工A类
public class EmployeeA implements Observer{ public void update(String state){ if (state.equals("老板来了")){ System.out.println("老板来了,我们撤退"); } } }
客户端调用
public class Demo { public static void main(String[] args) { Boss boss = new Boss(); EmployeeA observer = new EmployeeA(); boss.attach(observer); boss.change("老板来了"); } }
输出结果,可以看到员工A的确被通知到了,并且做出了对应的行动。