前言:

最近在学习总结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总结之链式调用(方法链)的更多相关文章

  1. javascript方法链式调用和构造函数链式调用对比

    先说一下方法链:B的实例从A继承了A中的同名方法,如果B的方法重载了A中的方法,B中的重载方法可能会调用A中的重载方法,这种方法称为方法链. 构造函数链:子类的构造函数B()有时需要调用父类的构造函数 ...

  2. 在 iOS 中实现方法链调用

    编译:伯乐在线 - 林欣达 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 前言 链式调用(chained calls)是指在函数调用返回了一个对象的时候,使得这个调用链 ...

  3. Android HTTP实例 使用GET方法和POST方法发送请求

    Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...

  4. [Effective JavaScript 笔记]第60条:支持方法链

    无状态的API的部分能力是将复杂操作分解为更小的操作的灵活性.一个很好的例子是字符串的replace方法.由于结果本身也是字符串,可以对前一个replace操作重复执行替换.这种模式的一个常见用例是在 ...

  5. ES6 Promise对象then方法链式调用

    then()方法的作用是Promise实例添加解决(fulfillment)和拒绝(rejection)状态的回调函数.then()方法会返回一个新的Promise实例,所以then()方法后面可以继 ...

  6. 测开之路一百零一:jquery文字特效、动画、方法链

    文字特效 html内容 1.卷起/展开 2.隐藏/显示 3.淡入淡出 <!DOCTYPE html><html lang="en"><head> ...

  7. php对象方法链式调用编程

    E:\html\tproject\framework\modules\common\classes\Common\CURL.php <?php /** * 同步发起请求 * 针对http协议的8 ...

  8. [Android] Android统计Apk , jar包方法数

    reference to : http://www.jianshu.com/p/61e8f803e0d1 Android在开发过程中,随着引用的库以及业务的增多,不可避免的会出现64K limit问题 ...

  9. android intent隐式调用之一个应用程序启动另一个应用程序

    理解Intent的关键之一是理解清楚Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者,这种方式与普通的函数调用类似:另一种是隐式的Intent,即Inten ...

随机推荐

  1. ASP.NET Core的路由[2]:路由系统的核心对象——Router

    ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...

  2. 【原创】免费申请SSL证书【用于HTTPS,即是把网站从HTTP改为HTTPS,加密传输数据,保护敏感数据】

    今天公司有个网站需要改用https访问,所以就用到SSL证书.由于沃通(以前我是在这里申请的)暂停了免费的SSL证书之后,其网站推荐了新的一个网站来申请证书,所以,今天因为刚好又要申请一个证书,所以, ...

  3. 如何利用ansible callback插件对执行结果进行解析

    最近在写一个批量巡检工具,利用ansible将脚本推到各个机器上执行,然后将执行的结果以json格式返回来. 如下所示: # ansible node2 -m script -a /root/pyth ...

  4. Android 几种消息推送方案总结

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量: 现 ...

  5. ASP.Net MVC——使用 ITextSharp 完美解决HTML转PDF(中文也可以)

    前言: 最近在做老师交代的一个在线写实验报告的小项目中,有这么个需求:把学生提交的实验报告(HTML形式)直接转成PDF,方便下载和打印. 以前都是直接用rdlc报表实现的,可这次牵扯到图片,并且更为 ...

  6. 监控 SQL Server (2005/2008) 的运行状况

    Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的 ...

  7. Linux监控工具介绍系列——OSWatcher Black Box

      OSWatcher Balck Box简介 OSWatcher Black Box (oswbb)是Oracle开发.提供的一个小巧,但是实用.强大的系统工具,它可以用来抓取操作系统的性能指标,用 ...

  8. 运用Mono.Cecil 反射读取.NET程序集元数据

    CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...

  9. SurfaceView 绘制分形图

    之前一直做的是应用类,这次抽时间,参考网上资料实践了下SurfaceView.目标是在页面上画一个科赫曲线的分形图. 代码如下: package com.example.fredric.demo02; ...

  10. JAVA通信系列三:Netty入门总结

    一.Netty学习资料 书籍<Netty In Action中文版> 对于Netty的十一个疑问http://news.cnblogs.com/n/205413/ 深入浅出Nettyhtt ...