娜样美的观察者模式【WIP】

观察者模式,是一种异常美丽的设计模式。本文包括定义、类图以及应用实例,例子采用 Java 实现。

1. 定义

观察者模式又称订阅者模式(可以将其看做报纸订阅服务,有两个主要角色,出版商和订阅者。假设出版商初版的杂志是周刊,那么一旦新杂志上架,出版商就将其邮寄给一个或多个订阅者)。

观察者模式在生活中每天都在上演。

快递小哥蹲在一家单位门口,被满地的包裹围攻,气定神闲。小哥咬了一口鸡蛋灌饼,对着手机说:“你好,你有快递到了……”

包裹被签收后,小哥将收件人从便签中划掉。

我们来简单分析一下这个场景。首先是人物:快递小哥一枚,收件人多只。那么,是什么将小哥和收件人联系起来的呢?是手机号,即小哥拥有所有收件人的手机号,以便通知收件人来领包裹——收件人事先在快递小哥那里注册了自己的信息(手机号)。


娜样美的观察者模式【WIP】_第1张图片
你站在桥上看风景

换言之,快递小哥是“主题”(Subject),收件人是观察者(Observer)。收件人向快递小哥注册自己的信息(实际上是在下订单时写的,然后由电商转给快递公司,再由快递公司分发给快递小哥,我们简化这一流程为收件人直接给快递小哥),然后等待快递小哥的通知,以便做出相应的行动。

言归正传,观察者模式由2部分组成:主题/Subject,观察者/Observer,Observer 在 Subject 中注册,然后等待 Subject 的通知。

《Head First 设计模式》下的定义:

观察者模式定义了对象之间的一对多依赖,当一个对象的状态发生改变时,它的所有依赖者都会收到通知并自动更新。


娜样美的观察者模式【WIP】_第2张图片
类图

2. 场景实现

我们用 Java 来实现拿快递这一场景。

2.1 Subject

我们将 Subject 定义为接口,接口中有3个行为:注册观察者,移除观察者,通知观察者。分别对应方法:registerObservers(),removeObservers(),removeObservers()。

快递小哥实现该接口,则具有并对外公开这3个行为,并按照自己的行为具体实现之,而具体实现内容则对外隐藏,更改这些方法的具体实现不影响其他对象的调用形式。

Subject.java

public interface Subject {

    public void registerObservers(Observer o);
    public void removeObservers(Observer o);
    public void removeObservers();
}

public class ExpressMan implements Subject {

    List<Observer> observerList;


    public ExpressMan() {
        this.observerList = new ArrayList<>(12);
    }

    @Override
    public void registerObservers(Observer o) {
        observerList.add(o);
    }

    @Override
    public void removeObservers(Observer o) {
        int i = observerList.indexOf(o);
        if (i > 0) {
            observerList.remove(i);
        }
    }

    @Override
    public void notifyObservers() {
        for (Observer o : observerList) {
            o.update();
        }
    }
}

2.2 Observer

Observer 接口只有1个行为:update()。观察者实现该接口,在该方法中实现自己的 update() 行为,如对于收件人 update() 则是暂停工作去取快递。

public interface Observer {

    void update();
}

public class Recipient implements Observer{

    Subject subject;

    public Recipient(Subject _subject) {
        this.subject = _subject;
        subject.registerObservers(this);
    }

    @Override
    public void update() {

        // 暂停工作,去取快递
    }
}

2.3 主函数

public class Main {

    public static void main(String[] args) {

        Subject Zhansan = new ExpressMan();

        Observer Lisi = new Recipient(Zhansan);
        Observer Wangwu = new Recipient(Zhansan);
        Observer Chenliu = new Recipient(Zhansan);

        Zhansan.notifyObservers();
    }
}

3. 观察者模式的优势

之所以说观察者模式那样美,是因为这种模式实现了两组对象的松耦合,它们只知道对方实现了什么接口,具有什么的样行为,而对其中的实现细节并不了解。

3. 应用实例

3.1 BaseAdapter

3.2 OnClickListener

to be continued…

你可能感兴趣的:(java,设计模式)