android观察者模式简单实现

android观察者模式简单实现

1.定义
观察者模式又被称为发布-订阅模式,属于行为型设计模式的一种,是非常常用的模式。它的定义如下:
定义对象间一种一对多的依赖关系,每当一个对象改变状态时,则所有依赖于它的对象都会得到通知并被自动更新
2.简介
观察者模式中包含以下角色:

  • Subject:抽象被观察者(即抽象主题)。抽象观察者把所有观察者对象保存在一个集合,每个被观察者都有任意数量的观察者。抽象观察者提供一个接口,可以增加和删除观察者。
  • ConcreteSubject:具体被观察者(具体主题)。具体被观察者实现了抽象观察者的接口,将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知。
  • Observer:抽象观察者,观察者的抽象类。它定义了一个更新接口,在收到被观察者(主题)发生改变的时候更新自己。
  • ConcreteObserver:具体观察者。实现抽象观察者定义的更新接口,以便在被观察者发生改变的时候更新自己。

很好理解,观察者模式实际上跟公众号类似:多个用户(即观察者)订阅了一个公众号(被观察者),公众号内部保存了订阅者的一个集合以及增加、删除订阅者和更新消息的方法。而用户则在公众号更新的时候会收到相应的消息。
3.简单的实现:

  • 创建抽象被观察者:
public interface Subject {
    /**
     * 添加订阅者
     *
     * @param observer
     */
    void attach(Observer observer);

    /**
     * 删除订阅者
     *
     * @param observer
     */
    void detach(Observer observer);

    /**
     * 更新,发布消息
     *
     * @param message
     */
    void notify(String message);
}
  • 创建抽象观察者
public interface Observer {
    /**
     * 更新消息接口
     * @param msg
     */
    void update(String msg);
}
  • 被观察者的实现
public class ConcreteSubject implements Subject {
    //用于保存观察者的列表
    private List<Observer> observerList = new ArrayList<>();

    @Override
    public void attach(Observer observer) {//添加观察者
        observerList.add(observer);
    }

    @Override
    public void detach(Observer observer) {//移除观察者
        observerList.remove(observer);
    }

    @Override
    public void notify(String message) {//发布更新
     //被观察者发布更新的时候遍历观察者,调用其更新方法
        for (Observer observer :
                observerList) {
            observer.update(message);
        }
    }
}
  • 具体观察者的实现
public class ConcreteObserver implements Observer {
    private String observerName;
    //构造方法用于区分不同观察者
    public ConcreteObserver(String observerName) {
        this.observerName = observerName;
    }
    //当被观察者更新时,更新自身
    @Override
    public void update(String msg) {
        System.out.println(observerName + "收到消息:" + msg);
    }
}

  • 简单使用及结果
        ConcreteObserver user1 = new ConcreteObserver("user1");
        ConcreteObserver user2 = new ConcreteObserver("user2");
        ConcreteObserver user3 = new ConcreteObserver("user3");

        ConcreteSubject subject = new ConcreteSubject();
        subject.attach(user1);
        subject.attach(user2);
        subject.attach(user3);

        subject.notify("公众号更新了");

输出结果:
在这里插入图片描述
可以看到,上述声明的三个user在subject更新的时候都收到了消息。
4.优点、缺点:

  • 优点:观察者与被观察者之间抽象耦合,容易扩展。方便建立一套处罚机制。
  • 缺点:如果程序中包含多个观察者和被观察者不易管理、调试。另外,android中的消息通知是顺序执行的,如果一个观察者卡顿会影响到整体的执行。

5.应用场景

  • 当一个对象的改变需要通知其它对象改变时,而且它不知道具体有多少个对象有待改变时。
  • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁时。
  • 跨系统的消息交换场景,如消息队列、事件总线的处理机制。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值