监听者模式(观察者模式)能升高对象之间耦合水平。为两个相互依赖调用的类进行解耦。

便于进行模块化开发工作。不同模块的开发者能够专一于本身的代码。

监听者用来监听自已感兴趣的事件,当收到自已感兴趣的事件时执行自定义的操作。
在某些数据变动时,其余的类做出一些响应。解决数据(或者散发事件)的类被动投送音讯,感兴趣的类被动“订阅”音讯。

监听者模式在 Android 中有大量的使用,置信大家都不会感到生疏。在 Android 开发中,Button 控件的点击事件就是监听者模式最常见的例子。

当 Button 被点击,执行了 OnClickListener.onClick。 Activity 中给这个Button 设置了本人实现的 OnClickListener,并复写了 onClick 办法,就能执行自定义操作了。

Java代码实例

上面来用 Java 来实现监听者模式。
这个例子是给“计算类”继续地传入数据,解决好数据后,收回后果。感兴趣的类接管后果。

2个文件:AlgoCalculator.javaMainUser.java
* AlgoCalculator.java 是计算局部,接收数据并进行计算。并将后果传递进来。 * MainUser.java 是调用方,将根本数据传入 AlgoCalculator 并监听后果。

package com.algo;import java.util.LinkedList;import java.util.List;public class AlgoCalculator {    private List<short[]> mDataBuffer = new LinkedList<>();    public AlgoCalculator() {    }    // 定义一个Listener接口;可将一个boolean值传递进来    public interface ResultChangeListener {        void onChange(boolean found);    }    private ResultChangeListener resultChangeListener;    // 调用方可能设置并实现这个接口    public void setResultChangedListener(ResultChangeListener resultChangedListener) {        this.resultChangeListener = resultChangedListener;    }    // 传输数据    public void setDataStream(short[] data) {        checkData(data);// 解决数据办法    }    // 解决数据,并送出后果    private void checkData(short[] data) {        if (data.length == 0) {            return;        }        long sum = 0;        for (short b : data) {            sum += b;        }        if (sum > 40) {            resultChangeListener.onChange(true); // 数据处理后果        } else {            resultChangeListener.onChange(false);        }    }}

主程序;调用方传入数据,获取后果

import com.algo.AlgoCalculator;public class MainUser {    public static void main(String[] args) {        AlgoCalculator algoCalculator = new AlgoCalculator(); // 初始化        // 设置监听器,并在外面减少要执行的动作        algoCalculator.setResultChangedListener(new AlgoCalculator.ResultChangeListener() {            @Override            public void onChange(boolean found) {                System.out.println("result: " + found);            }        });        short[] data1 = {1, 2, 3,};        short[] data2 = {10, 20, 30};        short[] data3 = {6, 7, 8};        short[] data4 = {1, 1, 1};        // 传入数据        algoCalculator.setDataStream(data1);    // output false        algoCalculator.setDataStream(data2);    // output true        algoCalculator.setDataStream(data3);    // output false        algoCalculator.setDataStream(data4);    // output false    }}

在另外的类里,可能很不便地调用 AlgoCalculator 的计算能力并获取计算结果。 在这里,每传入一次数据,就能获取一个后果。如果每秒钟传入一次数据,每秒钟就能获取一个后果。 咱们能够把简单的算法封装起来,客户端只须要传入数据,即可取得(监听到)后果。

很多场景中都应用了监听者模式。开发者也可能在人不知;鬼不觉中就使用了这个模式。

Android 中应用监听器

最常见的例子是给 Button 设置点击事件监听器。 相似上个例子,设计一个接口当做监听器。Android 中回调时能够利用 handler,管制调用的线程。

private Handler mMainHandler;mMainHandler = new Handler(Looper.getMainLooper());// 在主线程中运行private void notifySthChange(final int state) {    mMainHandler.post(new Runnable() {        @Override        public void run() {            ArrayList<SListener> list = new ArrayList<>(mListeners);            for (SListener l : list) {                l.OnSthChanged(state);            }        }    });}

在回调中能够间接更新UI。

【Android 零根底入门教程视频参考】