Android设计模式源码解析之责任链模式
====================================
> 本文为 [Android 设计模式源码解析](https://github.com/simple-android-framework-exchange/android_design_patterns_analysis) 中责任链模式分析
> Android系统版本: 4.4.4
> 分析者:[Aige](https://github.com/AigeStudio),分析状态:完成,校对者:[SM哥](https://github.com/bboyfeiyu),校对状态:撒丫校对中
## 1. 模式介绍
### 模式的定义
一个请求沿着一条“链”传递,直到该“链”上的某个处理者处理它为止。
### 模式的使用场景
一个请求可以被多个处理者处理或处理者未明确指定时。
## 2. UML类图
![UML](https://github.com/simple-android-framework-exchange/android_design_patterns_analysis/blob/master/chain-of-responsibility/AigeStudio/images/chain-of-responsibility.jpg?raw=true)
### 角色介绍
Client:客户端
Handler:抽象处理者
ConcreteHandler:具体处理者
## 3. 模式的简单实现
### 简单实现的介绍
责任链模式非常简单异常好理解,相信我它比单例模式还简单易懂,其应用也几乎无所不在,甚至可以这么说……从你敲代码的第一天起你就不知不觉用过了它最原始的裸体结构:分支语句:
```java
public class SimpleResponsibility {
public static void main(String[] args) {
int request = (int) (Math.random() * 3);
switch (request) {
case 0:
System.out.println("SMBother handle it: " + request);
break;
case 1:
System.out.println("Aige handle it: " + request);
break;
case 2:
System.out.println("7Bother handle it: " + request);
break;
default:
break;
}
}
}
```
谁敢说没用过上面这种结构体的站出来我保证不打屎他,没用过swith至少if-else用过吧,if-else都没用过你怎么知道github的……上面的这段代码其实就是一种最最简单的责任链模式,其根据request的值进行不同的处理。当然这只是个不恰当的例子来让大家尽快对责任链模式有个简单的理解,因为可能很多童鞋第一次听说这个模式,而人对未知事物总是恐惧的,为了消除大家的这种恐惧,我将大家最常见的code搬出来相信熟悉的代码对大家来说有一种亲切的感觉,当然我们实际应用中的责任链模式绝逼不是这么Mr.Simple,但是也不会复杂不到哪去。责任链模式,顾名思义,必定与责任Responsibility相关,其实质呢就像上面定义中说的那样一个请求(比如上面代码中的request值)沿着一条“链”(比如上面代码中我们的switch分支语句)传递,当某个处于“链”上的处理者(case定义的条件)处理它时完成处理。其实现实生活中关于责任者模式的例子数不胜数,最常见的就是工作中上下级之间的责任请求关系了。比如:
>程序猿狗屎运被派出去异国出差一周,这时候就要去申请一定的差旅费了,你心里小算一笔加上各种车马费估计大概要个两三万,于是先向小组长汇报申请,可是大于一千块小组长没权利批复,于是只好去找项目主管,项目主管一看妈蛋这么狠要这么多我只能批小于五千块的,于是你只能再跑去找部门经理,部门经理看了下一阵淫笑后说没法批我只能批小于一万的,于是你只能狗血地去跪求老总,老总一看哟!小伙子心忒黑啊!老总话虽如此但还是把钱批给你了毕竟是给公司办事,到此申请处理完毕,你也可以屁颠屁颠地滚了。
如果把上面的场景应用到责任链模式,那么我们的request请求就是申请经费,组长主管经理老总们就是一个个具体的责任人他们可以对请求做出处理但是他们只能在自己的责任范围内处理该处理的请求,而程序猿只是个底层狗请求者向责任人们发起请求…………苦逼的猿。
### 实现源码
上面的场景我们可以使用使用如下的代码来模拟实现:
首先定义一个程序员类:
```Java
/**
* 程序猿类
*
* @author Aige{@link https://github.com/AigeStudio}
*
*/
public class ProgramApe {
private int expenses;// 声明整型成员变量表示出差费用
private String apply = "爹要点钱出差";// 声明字符串型成员变量表示差旅申请
/*
* 含参构造方法
*/
public ProgramApe(int expenses) {
this.expenses = expenses;
}
/*
* 获取程序员具体的差旅费用
*/
public int getExpenses() {
return expenses;
}
/*
* 获取差旅费申请
*/
public String getApply() {
return apply;
}
}
```
然后依次是各个大爷类:
```Java
/**
* 小组长类
*
* @author Aige{@link https://github.com/AigeStudio}
*
*/
public class GroupLeader {
/**
* 处理请求
*
* @param ape
* 具体的猿
*/
public void handleRequest(ProgramApe ape) {
System.out.println(ape.getApply());
System.out.println("GroupLeader: Of course Yes!");
}
}
```
```Java
/**
* 项目主管类
*
* @author Aige{@link https://github.com/AigeStudio}
*
*/
public class Director {
/**
* 处理请求
*
* @param ape
* 具体的猿
*/
public void handleRequest(ProgramApe ape) {
System.out.println(ape.getApply());
System.out.println("Director: Of course Yes!");
}
}
```
```Java
/**
* 部门经理类
*
* @author Aige{@link https://github.com/AigeStudio}
*
*/
public class Manager {
/**
* 处理请求
*
* @param ape
* 具体的猿
*/
public void handleRequest(ProgramApe ape) {
System.out.println(ape.getApply());
System.out.println("Manager: Of course Yes!");
}
}
```
```Java
/**
* 老总类
*
* @author Aige{@link https://github.com/AigeStudio}
*
*/
public class Boss {
/**
* 处理请求
*
* @param ape
* 具体的猿
*/
public void handleRequest(ProgramApe ape) {
System.out.println(ape.getApply());
System.out.println("Boss: Of course Yes!");
}
}
```
好了,万事俱备只欠场景,现在我们模拟一下整个场景过程:
```Java
/**
* 场景模拟类
*
* @author Aige{@link https://github.com/AigeStudio}
*
*/
public class Client {
public static void main(String[] args) {
/*
* 先来一个程序猿 这里给他一个三万以内的随机值表示需要申请的差旅费
*/
ProgramApe ape = new ProgramApe((int) (Math.random() * 30000));
/*
* 再来四个老大
*/
GroupLeader leader = new GroupLeader();
Director director = new Director();
Manager manager = new Manager();
Boss boss = new Boss();
/*
* 处理申请
*/
if (ape.getExpenses() <= 1000) {
leader.handleRequest(ape);
} else if (ape.getExpenses() <= 5000) {
director.handleRequest(ape);
} else if (ape.getExpenses() <= 10000) {
manager.handleRequest(ape);
} else {
boss.handleRequest(ape);
}
}
}
```
运行一下,我的结果输出如下(注:由于随机值的原因你的结果也许与我不一样):
>爹要点钱出差
>
>Manager: Of course Yes!
是不是感觉有点懂了?当然上面的代码虽然在一定程度上体现了责任链模式的思想,但是确是非常terrible的。作为一个code新手可以原谅,但是对有一定经验的code+来说就不可饶恕了,很明显所有的老大都有共同的handleRequest方法而程序猿也有不同类型的,比如一个公司的php、c/c++、Android、IOS等等,所有的这些共性我们都可以将其抽象为一个抽象类或接口,比如我们的程序猿抽象父类:
```java
/**
* 程序猿抽象接口
*
* @author Aige{@link https://github.com/AigeStudio}
*
*/
public abstract class ProgramApes {
/**
* 获取程序员具体的差旅费用
*
* @return 要多少钱
*/
public abstract int getExpenses();
/**
* 获取差旅费申请
*
* @return Just a request
*/
public abstract String getApply();
}
```
这�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
为了满足广大Android开发爱好者与从业者的学习需求,我们精心整理并上传了一份全面而实用的Android项目资源包。这份资源包内容丰富,涵盖了从基础知识到实战应用的全方位内容,旨在为开发者们提供一个便捷、高效的学习平台。 一、文件手册 资源包中的文件手册部分,详细记录了Android开发的核心知识点和常用技术。无论是初学者还是有一定经验的开发者,都能从中找到所需的学习资料。手册采用了简洁明了的排版方式,使得查阅更加方便快捷。同时,手册内容深入浅出,既适合新手入门,也能为老手提供有价值的参考。 二、项目实战与练习 为了让学习者能够将理论知识与实践相结合,我们特别准备了项目实战与练习部分。这部分内容包含了多个精心设计的Android项目案例,从需求分析、设计思路到实现过程,都有详细的讲解和代码示例。学习者可以通过实际操作,深入了解Android开发的整个流程,提升自己的实战能力。 此外,我们还提供了一系列练习题,旨在巩固所学知识,检验学习成果。这些练习题既有基础题,也有难度较高的挑战题,适合不同层次的学习者进行练习。 三、Android开发工具集 在Android开发过程中,选择合适的工具能够大大提高开发效率。因此,我们整理了常用的Android开发工具集,包括开发工具、测试工具、性能优化工具等。这些工具都是经过我们精心筛选和测试的,能够帮助开发者们更加高效地进行Android开发工作。 总的来说,这份Android项目资源包是一份不可多得的学习资料,无论你是初学者还是有一定经验的开发者,都能从中受益匪浅。我们希望通过这份资源包,为广大Android开发爱好者与从业者提供一个更加便捷、高效的学习平台,共同推动Android开发领域的发展。
资源推荐
资源详情
资源评论
收起资源包目录
Android源码设计模式分析项目.zip (105个子文件)
.DS_Store 12KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
AndroidMileage.java 4KB
ReceiverRole.java 2KB
ClientRole.java 1KB
PeopleBean.java 1KB
InvokerRole.java 947B
ConcreteCommandImpl2.java 758B
ConcreteCommandImpl3.java 752B
ConcreteCommandImpl1.java 748B
Command.java 281B
MainTest.java 168B
chain-of-responsibility.jpg 50KB
factory-method.jpg 42KB
oop-principles.md 24KB
readme.md 22KB
readme.md 17KB
readme.md 17KB
readme.md 15KB
README.md 14KB
readme.md 12KB
readme.md 12KB
readme.md 11KB
README.md 9KB
readme.md 9KB
readme.md 7KB
readme.md 7KB
readme.md 5KB
readme.md 4KB
README.md 2KB
readme.md 2KB
readme.md 2KB
template.md 2KB
README.md 232B
README.md 229B
README.md 225B
README.md 218B
README.md 182B
README.md 176B
README.md 176B
README.md 173B
README.md 172B
README.md 170B
README.md 170B
README.md 170B
README.md 165B
README.md 161B
README.md 155B
README.md 155B
README.md 155B
README.md 155B
README.md 155B
README.md 155B
README.md 155B
README.md 155B
README.md 133B
android_design_pattern_analysis.md 0B
result-2.png 177KB
singleton-mr.simple-result.png 135KB
result.png 134KB
result-3.png 134KB
builder-uml.png 83KB
sms.png 76KB
contextimpl.png 51KB
lijunhuayc_result.png 49KB
facade.png 48KB
singleton-mr.simple-uml.png 46KB
result.png 37KB
no-facade.png 36KB
lijunhuayc_uml.png 33KB
uml.png 31KB
strategy-kerison-uml-android-animation-matrix.png 26KB
prototype-uml.png 26KB
flow.png 18KB
async-flow.png 16KB
strategy-kerison-uml-android-interpolator.png 14KB
strategy-kerison-uml-calc.png 14KB
strategy-kerison-uml-android.png 12KB
共 105 条
- 1
- 2
资源评论
01红C
- 粉丝: 1631
- 资源: 1098
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功