阅读 770

Android SDK开发艺术探索(四)个性化配置

一、前言

本篇是Android SDK开发艺术探索系列的第四篇文章。介绍了通过流式API设计思想优雅地实现SDK的自定义选项配置需求。

系列文章:

Android SDK开发艺术探索(一)开篇与设计

Android SDK开发艺术探索(二)Exception or ErrorCode

Android SDK开发艺术探索(三)初始化

Android SDK开发艺术探索(四)个性化配置

Android SDK开发艺术探索(五)安全与校验

Android SDK开发艺术探索(六)压缩与优化

Android SDK开发艺术探索(七)依赖原则与打包方法

二、SDK自定义配置

2.1、什么是自定义配置

在SDK开发中,常见的需求是提供一系列配置方法,用于自定义SDK行为。比如切换调试/正式模式,启动/关闭某些功能。

某推送SDK自定义配置方法示例

2.2、设计一个配置方法

前面我们介绍了自定义配置的概念,并且参考了某推送SDK实现的自定义配置方法。相信大家也能据此思想实现自己SDK的配置了吧!

但是,这种方式未免不太过瘾,我们平时开发的时候也可以看到Java代码中有一种很爽的调用方式,随便举个例子:

StringBuilder builder = new StringBuilder();
builder.append("one").append("two").append("three").length();
复制代码

可以看到,连续的流式调用API很方便也很简洁。这种API实现方式又称为流式接口(fluent interface)是软件工程中面向对象API的一种实现方式。那么问题来了,这么好的API设计思想,为什么不用到我们的SDK中来,让开发者爽一把呢?

先来回顾一下SDK配置的本质:SDK配置方法的本质是为SDK相关功能提供默认配置,并且接收开发者的自定义配置,用于修改默认逻辑。所以我们的方法中,不仅包含默认选项,还要包含修改方方法。话不多说,先上一份模板实例:

配置方法

/**
 * <pre>
 *     @author  : bruce
 *     @time    : 2020/07/10
 *     @desc    : MySDKConfig
 *     @version : 1.0
 * </pre>
 */
public class MySDKConfig {

    //默认配置
    private static boolean sDebug = false;
    private static long sTimeout = 8000L;

    private static final MySDKConfig.Config CONFIG = new MySDKConfig.Config();

    public static class Config {
        private Config() {
        }

        /**
         * 设置调试模式
         *
         * @param isDebug 模式
         * @return Config
         */
        public MySDKConfig.Config setDebug(final boolean isDebug) {
            sDebug = isDebug;
            return this;
        }

        /**
         * 设置超时时间
         *
         * @param timeout 超时时间
         * @return Config
         */
        public MySDKConfig.Config setTimeout(final long timeout) {
            //此处演示了边界值的处理方式
            long minTimeout = 3000L;
            if (timeout < minTimeout) {
                sTimeout = minTimeout;
            } else {
                sTimeout = timeout;
            }
            return this;
        }
    }

    public static boolean isDebug() {
        return sDebug;
    }

    public static long getTimeout() {
        return sTimeout;
    }

    public static MySDKConfig.Config getConfig() {
        return CONFIG;
    }

}
复制代码

调用示例

//一行代码,流式调用
MySDKConfig.getConfig().setDebug(true).setTimeout(8000L);
复制代码

从源码实例可以看到,我们提供了一些默认配置。并通过静态内部类来实现自定义配置,并且在外层提供了getter方法,将配置提供给SDK其他模块调用。

其中实现流式调用的关键就是每个setter方法中都返回了this对象本身,就这样实现了流式API接口。

在SDK开发的场景中,由于需要配置的内容多,还涉及到默认配置,特别适合采用流式API配置方法构建自定义配置。其实回头一想,这种设计思想其实不就是简化版建造者(Builder)模式的使用场景吗?

三、结语

回顾一下,本篇简单介绍了SDK自定义配置的实现,即通过流式API接口设计思想,结合SDK开发的实际需求,设计了一套流式调用(又称链式调用)的SDK个性化配置实现方案。

最后,如果本篇文档对您的开发有所帮助或启发,点赞/关注/分享三连就是对作者持续创作最好的激励,感谢支持!

参考文章

流式接口(fluent interface)

版权声明:

本文首发于我的专栏 AndDev安卓开发 已授权鸿洋公众号独家发布。

文章分类
Android
文章标签