Android总结之链式调用(方法链)
前言:
最近在学习总结Android属性动画的时候,发现Android的属性动画设计采用了链式调用的方式,然后又回顾了一下了以前接触的开源框架Glide也是采用链式调用的方式,还有最近火的一塌糊涂的RxJava也是采用链式调用,为何如此之多的开源项目采用这种设计方式,今天来对比学习一下。
什么是链式调用?
链式调用其实只不过是一种语法招数。它能让你通过重用一个初始操作来达到用少量代码表达复杂操作的目的。
表现形式:
一个初始化操作之后,后面的调用以“.”连接起来。例如Glide使用
Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
实际举例:
以以前做的简单的IM即时通讯消息体MsgInfo为例。
1.)普通实现方式
MsgInfo.java实现方式
public class MsgInfo {
/**
* 消息的类型
*/
public static class Type {
public final static int TEXT = 0; // 文本消息
public final static int IMAGE = 1; // 图片消息
public final static int VOICE = 2; // 语音消息
public final static int MOVIE = 3;// 视频消息
public final static int URL = 4;//URL消息
}
/**
* 消息的方向
*/
public static class Direct {
public final static int SEND = 0; // 发送
public final static int RECEIVE = 1; // 接收
}
/**
* 消息的状态
*/
public static class Status {
public final static int SEND_SUCCESS= 0; // 已发送
public final static int SENDING = 1; // 正在发送
public final static int SEND_FAILED = 2; // 发送失败
public final static int READ = 3; // 已读
public final static int UNREAD = 4; // 未读
}
private long msgId;//消息Id
private String ownerId;//消息属于哪个用户
private String relatedId;//消息关联到哪个用户;
private String body;//消息体
private long time;//消息发送接收时间
private int direct;// 消息的方向
private int status;//消息的状态
private int type;//消息的类型
public MsgInfo() {
}
public long getMsgId() {
return msgId;
}
public void setMsgId(long msgId) {
this.msgId = msgId;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getOwnerId() {
return ownerId;
}
public void setOwnerId(String ownerId) {
this.ownerId = ownerId;
}
public String getRelatedId() {
return relatedId;
}
public void setRelatedId(String relatedId) {
this.relatedId = relatedId;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public int getDirect() {
return direct;
}
public void setDirect(int direct) {
this.direct = direct;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
调用方式
MsgInfo msgInfo = new MsgInfo();
msgInfo.setOwnerId("100011002");
msgInfo.setRelatedId("1000110003");
msgInfo.setBody("hello 普通调用");
msgInfo.setType(MsgInfo.Type.TEXT);
msgInfo.setDirect(MsgInfo.Direct.SEND);
msgInfo.setStatus(MsgInfo.Status.SENDING);
msgInfo.setTime(System.currentTimeMillis());
2.)链式调用方式
MsgInfo.java实现
public class MsgInfo {
/**
* 消息的类型
*/
public static class Type {
public final static int TEXT = 0; // 文本消息
public final static int IMAGE = 1; // 图片消息
public final static int VOICE = 2; // 语音消息
public final static int MOVIE = 3;// 视频消息
public final static int URL = 4;//URL消息
}
/**
* 消息的方向
*/
public static class Direct {
public final static int SEND = 0; // 发送
public final static int RECEIVE = 1; // 接收
}
/**
* 消息的状态
*/
public static class Status {
public final static int SEND_SUCCESS= 0; // 已发送
public final static int SENDING = 1; // 正在发送
public final static int SEND_FAILED = 2; // 发送失败
public final static int READ = 3; // 已读
public final static int UNREAD = 4; // 未读
}
private long msgId;//消息Id
private String ownerId;//消息属于哪个用户
private String relatedId;//消息关联到哪个用户;
private String body;//消息体
private long time;//消息发送接收时间
private int direct;// 消息的方向
private int status;//消息的状态
private int type;//消息的类型
public MsgInfo() {
}
public long getMsgId() {
return msgId;
}
public MsgInfo setMsgId(long msgId) {
this.msgId = msgId;
return this;
}
public int getType() {
return type;
}
public MsgInfo setType(int type) {
this.type = type;
return this;
}
public String getOwnerId() {
return ownerId;
}
public MsgInfo setOwnerId(String ownerId) {
this.ownerId = ownerId;
return this;
}
public String getRelatedId() {
return relatedId;
}
public MsgInfo setRelatedId(String relatedId) {
this.relatedId = relatedId;
return this;
}
public String getBody() {
return body;
}
public MsgInfo setBody(String body) {
this.body = body;
return this;
}
public long getTime() {
return time;
}
public MsgInfo setTime(long time) {
this.time = time;
return this;
}
public int getDirect() {
return direct;
}
public MsgInfo setDirect(int direct) {
this.direct = direct;
return this;
}
public int getStatus() {
return status;
}
public MsgInfo setStatus(int status) {
this.status = status;
return this;
}
}
调用方式
MsgInfo msgInfo = new MsgInfo();
msgInfo.setOwnerId("100011002")
.setRelatedId("1000110003")
.setBody("hello 链式调用")
.setType(MsgInfo.Type.TEXT)
.setDirect(MsgInfo.Direct.SEND)
.setStatus(MsgInfo.Status.SENDING)
.setTime(System.currentTimeMillis());
3.)对比两者优劣
普通:
1:维护性强
2:对方法的返回类型无要求
3:对程序员的业务要求适中
链式:
1:编程性强
2:可读性强
3:代码简洁
4:对程序员的业务能力要求高
5:不太利于代码调试
Android总结之链式调用(方法链)的更多相关文章
- javascript方法链式调用和构造函数链式调用对比
先说一下方法链:B的实例从A继承了A中的同名方法,如果B的方法重载了A中的方法,B中的重载方法可能会调用A中的重载方法,这种方法称为方法链. 构造函数链:子类的构造函数B()有时需要调用父类的构造函数 ...
- 在 iOS 中实现方法链调用
编译:伯乐在线 - 林欣达 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 前言 链式调用(chained calls)是指在函数调用返回了一个对象的时候,使得这个调用链 ...
- Android HTTP实例 使用GET方法和POST方法发送请求
Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...
- [Effective JavaScript 笔记]第60条:支持方法链
无状态的API的部分能力是将复杂操作分解为更小的操作的灵活性.一个很好的例子是字符串的replace方法.由于结果本身也是字符串,可以对前一个replace操作重复执行替换.这种模式的一个常见用例是在 ...
- ES6 Promise对象then方法链式调用
then()方法的作用是Promise实例添加解决(fulfillment)和拒绝(rejection)状态的回调函数.then()方法会返回一个新的Promise实例,所以then()方法后面可以继 ...
- 测开之路一百零一:jquery文字特效、动画、方法链
文字特效 html内容 1.卷起/展开 2.隐藏/显示 3.淡入淡出 <!DOCTYPE html><html lang="en"><head> ...
- php对象方法链式调用编程
E:\html\tproject\framework\modules\common\classes\Common\CURL.php <?php /** * 同步发起请求 * 针对http协议的8 ...
- [Android] Android统计Apk , jar包方法数
reference to : http://www.jianshu.com/p/61e8f803e0d1 Android在开发过程中,随着引用的库以及业务的增多,不可避免的会出现64K limit问题 ...
- android intent隐式调用之一个应用程序启动另一个应用程序
理解Intent的关键之一是理解清楚Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者,这种方式与普通的函数调用类似:另一种是隐式的Intent,即Inten ...
随机推荐
- SQLServer事务同步下如何收缩日志
事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- 【接口开发】浅谈 SOAP Webserver 与 Restful Webserver 区别
接口,强大,简单,交互,跨越平台 下面简单阐述这两大接口思想 一 REST: REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. ...
- Node.js:理解stream
Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...
- 谈谈JS中的函数节流
好吧,一直在秋招中,都没怎么写博客了...今天赶紧来补一补才行...我发现,在面试中,讲到函数节流好像可以加分,尽管这并不是特别高深的技术,下面就聊聊吧! ^_^ 备注:以下内容部分来自<Jav ...
- Django
一.Django 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统) ...
- 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)
Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...
- c# 基础 object ,new操作符,类型转换
参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- Android中的多线程断点下载
首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就 ...