一、前言

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

目录概览:

一、前言
二、SDK自定义配置2.1、什么是自定义配置2.2、设计一个配置方法
三、结语

系列文章:

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)

由于开发者通过接口修改了菜单配置_Android SDK开发艺术探索(四)个性化配置...相关推荐

  1. 由于开发者通过接口修改了菜单配置_开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?...

    从用户的视角来感受一个开源项目的成长,是我们推出「开发者说」专栏的初衷,即在开发者进行开源项目选型时,提供更为立体的项目信息.专栏所有内容均来自作者原创/投稿,本文是「开发者说」的第9篇,作者郑扬勇, ...

  2. x64dbg 配置插件SDK开发环境

    x64dbg 是一款开源的应用层反汇编调试器,旨在对没有源代码的可执行文件进行恶意软件分析和逆向工程,同时 x64dbg 还允许用户开发插件来扩展功能,插件开发环境的配置非常简单,如下将简单介绍x64 ...

  3. 菜单Menu(AS开发实战第四章学习笔记)

    4.5 菜单Menu Android的菜单主要分两种,一种是选项菜单OptionMenu,通过按菜单键或点击事件触发,另一种是上下文菜单ContextMenu,通过长按事件触发.页面的布局文件放在re ...

  4. eclipse mysql jndi_裴东辉-MyEclipse和Eclipse中使用JNDI来配置程序的开发,以及服务器的配置 - 裴东辉...

    路径下面:C:\web\myeclipse\apache-tomcat-6.0.26\conf\Catalina\localhost 部署系统test.xml: auth="Containe ...

  5. android 打包 混淆配置_android 实际项目中混淆文件的配置(参考做法)

    之前对项目混淆一直了解不是很透,趁着打包正式项目的时候有特意的去了解了一番,做些记录,备忘! -optimizationpasses 5 -dontusemixedcaseclassnames -do ...

  6. 微信公众号通过接口修改菜单栏所遇问题errcode“:41001

    微信公众号开发者通过接口修改菜单配置所碰到的问题 {"errcode":41001,"errmsg":"access_token missing hi ...

  7. 不使用样式覆盖修改ant-design-vue菜单颜色

    不使用样式覆盖修改ant-design-vue菜单颜色 1.在vue.config.js中配置以下代码 使用的是less,需要安装(less,less-loader) module.exports = ...

  8. 微信公众号开发(五)个性化菜单

    微信公众号开发(五)个性化菜单 个性化菜单让公众号的不同用户群体看到不一样的自定义菜单.该接口开放给已认证订阅号和已认证服务号,个性化菜单要求用户的微信客户端版本在iPhone6.2.2,Androi ...

  9. 快消品行业定制化多租户SaaS系统:提供个性化配置,加速快消品企业运转效率

    快消品作为批发行业里竞争较大的品类,其发展情况一直以来都备受瞩目.2021年前三季度,中国快消品的销量和销售额分别增长3.3%和3.6%,实现温和复苏,同时,平均售价小幅上升0.3%,快消B2B行业由 ...

最新文章

  1. 福大计算机国二,福大学子喜获中国大学生计算机设计大赛二三等奖
  2. 在 Spring Boot 中,如何干掉 if else!
  3. Ansible基本使用及常用模块详解
  4. TCP 的有限状态机
  5. lost connection to MySQL server at waiting for initial communication packet,system error:o
  6. LAMP环境安装与apache配置
  7. excel匹配_「最全」Excel中查找匹配函数
  8. php无法连接远程服务器,php-无法在远程服务器上包含文件
  9. 2010-05-19 项目升级计划
  10. 微信支付接口详细步骤
  11. 揭开JS加密解密的神秘面纱(1)
  12. Winform做一个仿360界面
  13. 基于MDKA5D31-EK_T70开发板的QT示例-demo04:LM75A温度监测
  14. uniapp 截图或者生成海报
  15. 【PHP】 解决报错:Error: php71w-common conflicts with php-common-5.4.16-43.el7_4.x86_64
  16. .wine/drive_c/users/Public/Application Data/Source Insight/4.0
  17. VK16K33是带键盘扫描的LED数显/数码管驱动芯片多种封装选择驱动电流大,适合高亮显示场合
  18. 二三星缩水软件手机版_手机版的录音剪辑软件:清爽视频编辑APP
  19. spring-boot-starter-data-redis
  20. July, 8(R)

热门文章

  1. 如何优雅的移植JavaScript组件到Blazor
  2. .NET工资低?那肯定是你打开的方式不正确
  3. 云原生时代 给予.NET的机会
  4. 虚虚实实,亦假亦真的 ValueTuple,绝对能眩晕你
  5. 在生产环境下处理EFCore数据库迁移的五种方法
  6. 程序员过关斩将--Http请求中如何保持状态?
  7. 人工智能?.NetCore一样胜任!
  8. 当模板方法遇到了委托函数,你的代码又可以精简了
  9. 程序员与「中台」的爱恨交错
  10. C#中谁最快:结构还是类?