观察者模式

观察者模式=发布-订阅模式

Android中常用的EventBus以及Google Guava包中的event bus等都是对观察者模式的实现。

个人理解,从广义上讲,消息队列也是一种观察者模式的实现。

观察者模式的本质就是触发联动:在修改目标对象的状态的时候,就会触发相应的通知,然后会循环调用所有观察者对象相应的方法。

下面,我们实现以下功能:

当有新员工入职时,为其开通公司内部系统账号,并为其制作工牌;

当有员工离职时,为其关闭公司内部系统账号,并收回其工牌;

示例1:使用JDK中已有的观察者模式实现

目标类

public class Employee extends Observable {

    private String name;

    private Status status;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
        //有员工变动,则手动设置目标变化
        this.setChanged();
        //说明有员工入职
        if(status == Status.NEW){
            this.notifyObservers(this);
        }else if(status == Status.LEAVE){
            this.notifyObservers(this);
        }
    }

    enum Status{
        NEW, LEAVE
    }
}

观察者1

观察者2

验证

输出如下:

示例2:使用Google Guava中的event bus实现

目标

订阅者或观察者

验证

输出

guava的优势:①不必实现接口;②处理事件或状态变化的方法命名没有约束,而JDK中只能是update

对guava中event bus的源码简单分析,点击这里

参考

《研磨设计模式--第12章 观察者模式》

菜鸟教程:观察者模式

Last updated