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

013d1a973c11d3d0e50deead179d915e.png

一、前言

本篇是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行为。比如切换调试/正式模式,启动/关闭某些功能。

1ff7e26f1db5feae46f88b157d385e55.png
某推送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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中切片语法糖的使用

例子首先我们看这样一个例子&#xff0c;有这样一个数组string [] lst new string[] { "1", "2", "3", "4", "5", "6", "7" };我们怎么获取它的最后一个值&#xff0c; 传统方法是这样写的&#xff0c…

JavaScript 语言基础知识点总结(思维导图)

1.JavaScript数组 2.JavaScript 函数基础 3.Javascript 运算符 4.JavaScript 流程控制 5.JavaScript 正则表达式 6.JavaScript 变量 7.JavaScript 字符串函数 8.DOM 基本操作 制作工具&#xff1a;Mindjet MindManager 文章摘自&#xff1a;http://m.oschina.net/blog/175426转…

linux之一些比较新但是常用的命令(expr ag tree cloc stat tmux axel)

1 expr命令 介绍:这个命令用来匹配正则表达式,这个命令linux系统自带,不信你自己试下 使用:expr 正则表达式 输出结果 expr http:\/\/www\.baidu\.com http//www.baidu.com 用了这个命令,我们就不需要在网上去搞在线正则表达式匹配 2 tree命令 这个命令需要安装 sudo…

illegal multibyte sequence python3

错误信息如下&#xff1a; 1 page_data m.decode(gbk) 2 UnicodeDecodeError: gbk codec cant decode byte 0xa7 in position 3868: illegal multibyte sequence 解决办法&#xff1a; 1 page_data m.decode(gbk, ignore) 因为decode的函数原型是decode([encoding], [er…

java ssh 和mvc_[转]JAVA三大框架SSH和MVC

Java—SSH(MVC)JAVA三大框架的各自作用hibernate是底层基于jdbc的orm(对象关系映射)持久化框架&#xff0c;即&#xff1a;表与类的映射&#xff0c;字段与属性的映射&#xff0c;记录与对象的映射 数据库模型 也就是Model;struts提供的丰富标签是用于显示层View;同时struts也充…

Android Studio开发基础之Context用法说明

1、Context说明 Context是一个用于访问全局信息的接口,如应用程序的资源(如图片,字符串等),一些常用的组件继承自Context,如Activity和Service等等。 如利用Java代码创建一个textView,textView的第一种setText()方法直接传入一个字符串,第二种setText()方法传入…

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)

作者信息 作者: 彭东林 邮箱&#xff1a;pengdonglin137163.com QQ&#xff1a;405728433 平台简介 开发板&#xff1a;tiny4412ADK S700 4GB Flash 要移植的内核版本&#xff1a;Linux-4.4.0 &#xff08;支持device tree&#xff09; u-boot版本&#xff1a;友善之臂自带的…

【C语言简单说】八:分支结构之if...else if()...else...(3)

既然前面几种情况大家都了解了话&#xff0c;这一节的话我就不举例子了。。。 直接上代码&#xff1a; #include<stdio.h> #include<stdlib.h> int main() {int a1;if(a1){printf("a的值等于1\n");}else if(a2){printf("a的值等于2\n"); …

最通俗易懂的依赖注入与控制反转

这是一个关于 ASP.NET 6 依赖注入的系列文章。在这个系列中&#xff0c;我们将了解到什么是依赖注入、控制反转&#xff0c;它能够做什么&#xff0c;以及我们为什么要使用它。之后&#xff0c;我们会进一步了解 ASP.NET 6 依赖注入的生命周期、服务容器等重要概念。最后&#…

word公式编辑器_论文查重算公式吗 公式怎样避免查重?

论文查重算公式吗 公式怎样避免查重?每一个毕业生想要毕业都要经过论文查重这一关&#xff0c;仅有通过了论文查重&#xff0c;才可以进入答辩。在论文检测的情况下&#xff0c;不少同学论文中一定会应用大批量的计算公式&#xff0c;且计算公式全部都是固定不动的&#xff0c…

java string 数据结构_数据结构---Java---String、StringBuilder、StringBuffer

1、概述1.1  String&#xff1a;不可变字符串public final class String implements java.io.Serializable, Comparable, CharSequence {//final的字符数组private final char value[];}1.2  StringBuilder&#xff1a;可改变的字符串&#xff0c;线程不安全public final c…

adb logcat 查看日志

使用 logcat 命令 查看和跟踪系统日志缓冲区的命令logcat的一般用法是&#xff1a; [adb] logcat [<option>] ... [<filter-spec>] ... 下文介绍过滤器和命令选项&#xff0c;详细内容可参见Listing of logcat Command Options。 可以在开发机中通过远程shell的方式…

小程序 - 学习笔记

一、小程序文档笔记 默认开发目录 开发目录解析 1.  app.js、app.json、app.wxss 这三个文件必须有不能删掉。 一个小程序主体部分由这三个文件组成&#xff0c;而且必须放在项目的根目录 js后缀的是脚本文件&#xff0c;调用小程序框架提供的 API—— API 文档json后缀的文件…

Android Studio开发基础之Service

1、Service的使用 Activity可以呈现一个用户界面,但是Service确实运行在后台,新建一个Myservice.java,会在AndroidManifest中自动配置<Service>标签。 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://…

linux之sudo apt-get install **** 是到哪里下载软件以及下载到哪里去了

1 问题 我们平时在linux系统上更新软件,一般都是执行 sudo apt-get install 软件名 为什么这个命令就能下载软件了呢? 下载的软件放到哪里去了呢? 2 sudo apt-get install是到哪里下载软件 apt-get,是一条linux命令,适用于deb包管理式的操作系统 比如我的ubuntu上面有…

【C语言简单说】九:输入

到了下午了&#xff0c;上着班发现没啥事情做… 又来码博客了 ↖(▔&#xff3e;▔)↗ 这一小节我们来说说输入吧。突然想总结以下if语句的&#xff0c;结果发现&#xff0c;还有一个输入没说&#xff1b;之前是不是说过了输出&#xff1f;就是printf这个&#xff0c;现在还有…

java 优秀源码_想要快速进阶Java架构师?这份超强(长)学习计划单 请签收!...

优秀工程师的成长之路就是一条不断打怪升级之路的“修仙之路”&#xff01;而Java程序员一向比别人更难&#xff0c;如果说大家都在修仙的话&#xff0c;java程序员简直神似“剑修”&#xff0c;入行枯燥精通难&#xff0c;要想变得强大&#xff0c;需要能力也需要运气&#xf…

Web Api如何传递POST请求

这里记录一次Web Api传递post请求的例子&#xff0c;由于使用了默认工程的例子&#xff0c;方法名的参数值标记头为FromBody的形式&#xff0c;如下图所示的调用&#xff1a; 调用方式&#xff1a; 那么如果要两个以上的参数如何去实现&#xff0c;这种方式是不行的&#xff0c…

java 不能反序列化_不能将“Java.Lang.Studio”实例反序列化到StaskObl对象令牌中

我收到下面的错误消息,有人能帮助或建议如何最好地调试它吗?无法反序列化的实例java.lang.String超出起始值的对象[来源:(pushbackinputstream)处的令牌;行:1,列:37610](通过参考链:CopyToList[[产品] ] -gt;java. U.L.AyayList[ 23 ] -&G.M.Mult.产品[“价格”] -& c…

Android Studio开发基础之启动Service,并通过从Activity向Service传递数据

本实例演示启动Service&#xff0c;并通过从Activity向Service传递数据&#xff0c;新建一个Service&#xff0c;并敲如下代码&#xff1a; package com.example.lhb.startservice;import android.app.Service; import android.content.Intent; import android.os.IBinder; imp…