Android设计模式详解之责任链模式
创始人
2024-04-28 11:55:34

前言

责任链模式是行为型设计模式;

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

使用场景:

  • 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定;
  • 在请求处理者不明确的情况下向多个对象中的一个提交一个请求;
  • 需要动态指定一组对象处理请求;

UML类图:
责任链UML
AbstractHandler:抽象处理者角色;
属性:
nextHandler:保持对下一个节点处理者对象的引用;
方法:
handleRequest(AbstractRequest request):处理请求;
getHandleLevel():获取处理者对象的处理级别;
handle():每个处理者对象的具体处理方式;

AbsRequest:抽象请求者角色;
属性:
obj:处理对象;
方法:
getContent():获取具体的处理对象;
getRequestLevel():获取请求级别;

ContrectHandler1ContrectHandler2ContrectHandler3 : 具体的处理者对象;
ContrectRequest1ContrectRequest2ContrectRequest3 : 具体的请求者对象;

Client:客户端调用者;

实现示例

这里举个简单的栗子,忽略UML图中的请求者角色,比如你是公司员工需要请假,3天以内的主管可以直接审批通过,大于3天小于7天的部门经理可以审批通过,如果7天以上的需要董事长才可以审批通过,下面我们就针对这个例子使用责任链模式来实现;

  • 定义抽象领导者类,Leader
/*** 抽象领导者*/
abstract class Leader {var nextLeader: Leader? = nullfun handleRequest(days: Int) {if (handleDays(days)) {handle(days)} else {nextLeader?.handleRequest(days)}}/*** 当前领导是否可以审批请假天数*/protected abstract fun handleDays(days: Int): Boolean/*** 具体审批操作*/protected abstract fun handle(days: Int)
}
  • 部门主管处理者,DirectorLeader
/*** 部门主管处理者*/
class DirectorLeader : Leader() {override fun handleDays(days: Int): Boolean {return days <= 3}override fun handle(days: Int) {println("部门主管审批${days}天假期通过")}
}
  • 经理处理者,ManagerLeader
/*** 经理处理者*/
class ManagerLeader : Leader() {override fun handleDays(days: Int): Boolean {return days <= 7}override fun handle(days: Int) {println("经理审批${days}天假期通过")}
}
  • 老板处理者,BossLeader
/*** 老板处理者*/
class BossLeader : Leader() {override fun handleDays(days: Int): Boolean {return true}override fun handle(days: Int) {println("老板审批${days}天假期通过")}
}
  • 测试类
object Test {@JvmStaticfun main(args: Array) {//构造各个领导val directorLeader = DirectorLeader()val managerLeader = ManagerLeader()val bossLeader = BossLeader()directorLeader.nextLeader = managerLeadermanagerLeader.nextLeader = bossLeaderdirectorLeader.handleRequest(2) //打印结果:部门主管审批2天假期通过directorLeader.handleRequest(6) //打印结果:经理审批6天假期通过directorLeader.handleRequest(10) //打印结果:老板审批10天假期通过}
}

当然,如果部门主管和经理都不在的时候,我们可以直接提交给老板进行处理,这就是责任链模式的灵活之处!

Android源码中的责任链模式

  • View事件分发流程,这里不再过多赘述,大家肯定都比较清楚;
  • OkHttp发起网络请求,通过责任链模式一层一层将请求进行封装并发起最终请求;

总结

优点:
可以对请求者和处理者关系解耦,提高代码的灵活性。

缺点:
需要对链中请求处理者进行遍历,如果处理者太多,会影响性能。

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

相关内容

热门资讯

长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
亚克力是什么 亚克力制品对人体... 亚克力其特殊的物理性能使其可以承载超高水体压力,从而让超大水体成为可能。水族领域亚克力板材一直是海洋...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
如何吸引顾客 怎样吸引顾客加入... 如何激活群的顾客活跃度,是商家在运营过程中绕不开的事情。当新用户来到商家的私域流量群时,商家一般会采...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...