设计模式之《责任链模式》

news/2024/5/19 14:24:45 标签: 设计模式, 责任链模式, android

------《责任链模式

责任链模式的概念

责任链模式是一种行为型设计模式,它允许你将请求沿着处理链传递,直到有一个处理者能够处理该请求为止。

责任链模式中,每个处理者都有自己的逻辑处理方式,当该处理者无法处理该请求时,它会将请求传递给下一个处理者,直到请求被处理为止。这种模式可以有效地避免项目中出现大量 if else 语句的情况,同时也方便代码的维护。

为什么用责任链模式

使用责任链模式的好处在于,它可以有效地处理复杂的业务场景。在实际项目中,往往存在多种业务逻辑需要进行处理,同时这些业务的处理顺序也可能会有所不同。使用责任链模式可以将这些业务逻辑进行灵活组合,并且能够随时调整处理顺序,提高代码的可维护性和扩展性。

工作中用在哪里

在Android开发中,使用责任链模式的场景比较多。比如,我们在进行网络请求时,可能需要对请求进行拦截和处理,比如判断网络是否可用、是否需要进行重试、是否需要缓存等等。这些处理逻辑可能是有先后顺序的,这时就可以采用责任链模式来组合这些处理逻辑。

设计思路

在设计责任链模式时,需要定义一个抽象处理者的接口,该接口定义了处理请求的方法和设置下一个处理者的方法。然后定义具体的处理者类,它们分别实现抽象处理者接口,并在处理请求时进行逻辑处理。最后将这些处理者组合成一条链,每个处理者都设置它的下一个处理者。

代码实现

我们以Android的网络请求为例,实现一个简单的责任链模式

首先定义一个抽象的请求处理者接口:

public interface RequestHandler {

    void handleRequest(Request request, Chain chain);

    interface Chain {

        Request request();

        void proceed(Request request);
    }
}

上述接口定义了处理请求的方法 handleRequest 和设置下一个处理者的方法 proceed。其中,Chain接口定义了获取请求对象的方法 request(),每个处理者可以通过该方法获取请求的信息,并通过调用 proceed()方法将请求传递给下一个处理者。

然后定义具体的请求处理者:

public class NetworkAvailableHandler implements RequestHandler {

    @Override
    public void handleRequest(Request request, Chain chain) {
        if (isNetworkAvailable()) {
            chain.proceed(request);
        } else {
            // 网络不可用,直接返回错误信息
            request.setError(new Error("Network is not available"));
            // 处理完成,回调请求结果
            onRequestFinished(request);
        }
    }

    private boolean isNetworkAvailable() {
        // 判断当前网络是否可用
        return true;
    }
}

public class RetryHandler implements RequestHandler {

    private static final int MAX_RETRY_COUNT = 3;

    @Override
    public void handleRequest(Request request, Chain chain) {
        int retryCount = 0;
        while (retryCount < MAX_RETRY_COUNT) {
            try {
                chain.proceed(request);
                break;
            } catch (IOException e) {
                retryCount++;
            }
        }
    }
}

public class CacheHandler implements RequestHandler {

    @Override
    public void handleRequest(Request request, Chain chain) {
        if (request.isCacheEnabled() && isCached(request.getUrl())) {
            // 如果缓存可用,直接从缓存中获取数据
            request.setResult(getCache(request.getUrl()));
            // 处理完成,回调请求结果
            onRequestFinished(request);
        } else {
            // 如果缓存不可用,继续往下处理
            chain.proceed(request);
        }
    }

    private boolean isCached(String url) {
        // 判断当前请求是否已经缓存
        return false;
    }

    private String getCache(String url) {
        // 从缓存中获取数据
        return null;
    }
}

其中,NetworkAvailableHandler 类判断网络是否可用;RetryHandler 类实现了请求的重试逻辑;CacheHandler 类实现了请求的缓存逻辑。

最后将这些处理者对象组成一条处理链:

RequestHandler cacheHandler = new CacheHandler();
RequestHandler retryHandler = new RetryHandler();
RequestHandler networkHandler = new NetworkAvailableHandler();

cacheHandler.setNextHandler(retryHandler);
retryHandler.setNextHandler(networkHandler);

其中,setNextHandler() 方法用于设置当前处理者的下一个处理者对象。

最终,将请求对象传入处理链的第一个处理者中,经过一系列处理后,请求的结果将通过 onRequestFinished() 方法进行回调。

总结

责任链模式可以灵活地处理多重业务逻辑,同时也能够随时调整处理顺序,提高代码的可维护性和扩展性。在Android开发中,使用责任链模式可以方便地处理网络请求、事件分发等复杂业务场景。


http://www.niftyadmin.cn/n/217475.html

相关文章

MACH SYSTEMS网关:SAE J2716(SENT) 转 RS-232/CAN

双通道SAE J2716&#xff08;SENT&#xff09;至RS-232/CAN总线网关&#xff0c;具有两个双向SENT通道和RS-232&#xff08;SENT-RS232&#xff09;或CAN总线&#xff08;SENT-CAN&#xff09;接口。两种变体还提供两个模拟输出&#xff0c;可以直接将输入SENT数据转换为模拟电…

android图库隐藏不愿显示的图片及目录

前言&#xff1a;当你的相册图片过多&#xff0c;打开加载很慢的情况下&#xff0c;通常我们会想部分不显示&#xff0c;隐藏掉&#xff0c;那么你就可以按照以下的方法解决 用你的手机文件浏览器或者文件管理器打开根目录&#xff0c;新建一个名为**.nomedia**文件,复制这个文…

9.Nuxt.js的使用

九.Nust.js的使用 1.什么是SEO 2.百度的搜索结果 3.服务器端和客户端渲染 4.Nuxt.js技术简介 5.Nuxt.js的路由&#xff08;使用提供的nuxt-app项目初始化&#xff09; 6.Nuxt.js的页面布局和整体配置 7.Nuxt.js整合axios 九.Nust.js的使用 1.什么是SEO ①SEO SEO是通…

【20230407】【每日一题】编辑距离

给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 注意这里的插入、删除、替换操作。插入可以看成是word2的删除 1.dp[i][j]]表示以下标…

AVL树介绍

AVL树AVL树的概念AVL树结点的定义AVL树的插入AVL树的旋转&#xff08;1&#xff09;左单旋&#xff08;2&#xff09;右单旋&#xff08;3&#xff09;左右双旋&#xff08;4&#xff09;右左双旋AVL树的验证AVL树的性能AVL树的概念 二叉搜索树虽然可以提高我们查找数据的效率…

算法训练第五十五天 | 392.判断子序列、115.不同的子序列

动态规划part15392.判断子序列题目描述思路总结115.不同的子序列题目描述思路392.判断子序列 题目链接&#xff1a;392.判断子序列 参考&#xff1a;https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html 题目描述 给定字符串 s 和 t &…

【02】惯性导航-惯性导航系统(INS)| 惯性导航系统原理 | 单多自由度惯性导航 | 捷联式系统与平台式系统 | INS精度等级 | 惯性器件测量能力量化

目录 1.惯性导航系统2. 惯性导航原理2.1单自由度惯性导航-1D2.2多自由度惯性导航-2D/3D2.2.1二维平面惯导系统-平台式系统2.2.2二维平面惯导系统-捷联式系统2.2.3惯性导航系统的物理实现2.2.3平台式与捷联式管道特点对比2.2.3惯性导航系统特性2.2.4INS的精度等级2.2.4惯性器件相…

ADManager Plus:简化 Active Directory 管理的完美工具

在企业中&#xff0c;Active Directory&#xff08;AD&#xff09;是一个非常重要的组件&#xff0c;用于管理和控制所有计算机和用户的访问权限。然而&#xff0c;AD的管理和维护需要一定的技术能力和时间成本。为了简化这个过程&#xff0c;ManageEngine 推出了 ADManager Pl…