观察者模式
Table of Contents

什么是观察者模式

观察者模式又叫发布-订阅模式。
观察者模式定义了一种一对多的关系,让多个观察者对象监听某一个主题对象。当这个主题对象状态发生变化的时候,会通知该主题对象所需要通知的观察者,使被通知到的观察者能够做出对应的改变

观察者模式常用场合。

概括来说,观察者模式适用于当一个对象的改变需要同时改变其他对象的时候
举个例子的话,就拿我们的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的确被通知到了,并且做出了对应的行动。