Java设计模式Android开发Android开发经验谈

观察者模式

2018-02-28  本文已影响52人  某人_Valar

作者:某人_Valar
如需转载请保留原文链接;

设计模式的3大类:

1. 什么是观察者模式

观察者模式又被称为发布-订阅模式,属于行为型设计模式中的一种。

观察者模式就像报纸的订阅。

  • 1 报社的业务就是出版报纸
  • 2 向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他么的订户,就会一直收到报纸。
  • 3 当你不想再看报纸的时候,取消订阅,他们就不会再送报纸来。
  • 4 只要报社还在运营,就会一直有人向他们订阅报纸或者取消订阅。

在观察者模式中出版者被称为“主题(Subject)”,订阅者称为“观察者(Observer)”

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

2. 观察者模式的实现

拿微信公众号系统来说,公众号是Subject,订阅的用户是Observer,当公众号更新时就会通知这些用户。

(1)观察者接口

所有的观察者都必须实现观察者接口,其里面定义的update方法会在主题状态改变时调用。

public interface Observer {
    public void update(String message);
}
(2)具体观察者
public class WeixinUser implements Observer {
    //微信用户名
    private String name;
    public WeixinUser(String name){
        this.name = name;
    }
    @Override
    public void update(String message) {
        System.out.println(name+" -- "+message);
    }
}
(3)被观察者(主题)接口
public interface Subject {
    //增加订阅者
    public void attach(Observer observer);
    //删除订阅者
    public void detach(Observer observer);
    //通知订阅者更新消息
    public void notify(String message);
}
(4)具体的被观察者(主题)

在这个例子中,微信公众号是Subject(主题),其需要实现主题接口里面的方法,另外还需要存储订阅了此公众号的微信用户。

public class SubscriptionSubject implements Subject {
    //存储订阅公众号的微信用户
    private List<Observer> weixinUserList = new ArrayList<>();
    @Override
    public void attach(Observer observer) {
        weixinUserList.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        weixinUserList.remove(observer);
    }

    @Override
    public void notify(String message) {
        for (Observer observer: weixinUserList) {
            observer.update(message);
        }
    }
}
(5)测试
public class Test {
    public static void main(String[] args){
        SubscriptionSubject mSubject = new SubscriptionSubject();
        //创建微信用户
        WeixinUser user1 = new WeixinUser("鲁班大师");
        WeixinUser user2 = new WeixinUser("程咬金");
        WeixinUser user3 = new WeixinUser("宫本武藏");
        //订阅公众号
        mSubject.attach(user1);
        mSubject.attach(user2);
        mSubject.attach(user3);
        //公众号更新发出新的消息给订阅的用户
        mSubject.notify("敌军还有30秒到达战场");
    }
}

运行结果


控制台结果

3. 使用观察者模式的场景以及优缺点

使用场景:

优点:

缺点:

松耦合(观察者模式是松耦合的一种实现方式):
当两个对象之间松耦合,他们依然可以交互,但是不太清除彼此的细节。

参考:

《Head First设计模式》
《Android进阶之光》
观察者模式-w3cschool
观察者模式-菜鸟教程

上一篇 下一篇

猜你喜欢

热点阅读