《Android源码设计模式》读书笔记 (12) 第12章 观察者模式

这篇读书笔记探讨了观察者模式在Android源码中的应用,特别是在IM即时通讯语音录制发送模块。文章阐述了模式定义,即创建一对多的依赖关系,当对象状态改变时,所有依赖的对象都会得到通知并更新。通过UML类图,展示了被观察者和观察者的角色分工,并提到了观察者模式在GUI和订阅-发布系统中的常见应用。
摘要由CSDN通过智能技术生成

前言

最近在做IM即时通讯语音录制发送这个模块的时候,用到了观察者模式,因此结合书上内容在加深了一遍,不得不说观察者模式是一个使用率非常高的模式.

定义

  • 定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新
  • 作用:将观察者和被观察者解耦.最常用在GUI系统,订阅-发布系统.笔者遇到的场景是聊天语音播放和控制.
  • 应用场景:关联行为场景,多级触发场景,系统的消息交换场景;

UML类图

这里写图片描述

Subject:被观察者

/**
 * 被观察者 接口
 * 作用: 提供增删,通知观察者的方法
 * @author max
 * @date 2016年2月17日
 * 
 *
 */
public interface Subject {

    //增
    void addObserver(Observer observer);

    //删
    void deleteObserver(Observer observer);

    //通知--这里可以自己根据实际业务需求,传递参数,通知所有观察者要做的事
    void notifyObserver();
}

ConcreteSubject:具体被观察者

/**
 * 具体被观察者,
 * 作用:1.实现Subject接口 2.保存所有观察者对象
 * @author max
 * @date 2016年2月17日
 *
 */
public class ConcreteSubject implements Subject{
    private List<Observer> list = new ArrayList<>();


    @Override
    public void notifyObserver() {
        if (list != null && list.size() > 0) {
            //遍历所有观察者,接收通知,实现具体业务逻辑
            for (Observer observer : list) {
                observer.update();
            }
        }
    }


    @Override
    public void addObserver(Observer observer) {
        list.add(observer);
    }


    @Override
    public void deleteObserver(Observer observer) {
        list.remove(observer);
    }

}

Observer:观察者,

/**
 * 观察者接口
 * 作用:提供update方法,收到被观察者通知,实现具体业务
 * @author max
 * @date 2016年2月17日
 *
 */
public interface Observer {

    void update();
}

ConcreteObserver:具体观察者.

/**
 * 具体观察者,实现业务逻辑
 * @author max
 * @date 2016年2月17日
 *
 */
public class ConcreteObserver implements Observer{

    @Override
    public void update() {
        //根据自己业务需求,写观察者收到被观察者变化的业务逻辑代码
    }

}

具体使用场景:拟被观察者Subject发生变化,所有观察者接收到通知,实现所有观察者update()业务过程

/**
     * 模拟被观察者Subject发生变化,所有观察者接收到通知,实现其业务过程
     */
    private void simple() {
        //被观察者
        Subject subject = new ConcreteSubject();
        //所有观察者
        Observer observer1 = new ConcreteObserver();
        Observer observer2 = new ConcreteObserver();
        Observer observer3 = new ConcreteObserver();
        Observer observer4 = new ConcreteObserver();

        //加入到所有观察者集合里面去
        subject.addObserver(observer1);
        subject.addObserver(observer2);
        subject.addObserver(observer3);
        subject.addObserver(observer4);

        //被观察者状态发生改变,通知所有观察者,所有观察者执行update()方法,会分别取执行4个具体observer的update()方法
        subject.notifyObserver();

    }

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值