行为型设计模式之责任链模式

原创 2017年10月06日 15:02:45

责任链模式介绍

责任链模式(Iterator Pattern),是行为型设计模式之一。什么是”链”?我们将多个结点首尾相连所构成的模型称之为链。

责任链模式的定义

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

责任链模式的使用场景

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

责任链模式的简单实现

小李某天接到通知说需要出差去某国进修学习新技术,小李听到这消息心中一喜,于是收拾完背包踏上了去某国进修的旅途。小李去某国学习一趟花费了近5万元,于是小李上班后的第一天就向组长申请报销费用,组长一看是笔不小的数目,他没有权限审批,于是组长就拿着票据去找部门主管,主管一看要报这么多钱,自己权限内只能批五千以下的费用,这完全超出了自己的权限范围,于是主管又跑去找经理,经理一看二话不说直接拿着票据奔向了老板的办公室,因为他只能批一万以下的费用。类似的情况对上班族来说肯定是不少见的,上面的这个场景其实就是一个责任链的小例子,每一个人,准确地说是每一类人代表这条链上的一个节点,小李是请求的发起者,而老板则是处于链条顶端的类,小李从链的低端开始发出一个申请报账的请求,首先由组长处理该请求,组长比对后发现自己权限不够于是将该请求转发给位于链中下一个结点的主管,主管比对后也发现自己的权限不够,又将请求转发给经理,而经理也基于同样的原因将请求转发给老板,这样层层转达直至请求被处理,从中大家不难发现,就是自始自终小李只与组长关联,然后由具体谁处理的票据,小李并不关心,唯一在乎的是报账的结果,责任链这里很好地将请求的发起者与处理者解耦。

如果我们在代码中模拟这个过程也是很直观的,首先我们要先声明一个抽象的领导类

//抽象的领导类
public abstract class Leader{
protected Leader nextHandler;//上一级领导处理者
//处理报账请求
//@param money 能批复的报账额度
public final void handleRequest(int money){
if(money<limit){
handle(money);
}else{
if(null!=nextHandler)
nextHandler.handlerRequest(money);
}
}

//自身批复的额度权限
//@return 额度
public abstract int limit()
//处理报账行为
//@param money 具体金额
public abstract void handler(int money);
}

在这个抽象的领导类只做了两件事,一是定义了两个抽象接口方法来确定一个领导者应有的行为和属性,二是声明了一个处理报账请求的方法来确定当前领导是否有能力处理报账请求,如果没有这个权限,则将该请求交给上级领导处理。接下来则是各个领导类的实现。

//各个具体领导类的实现
public class GroupLeader extends Leader{
@Override
public int limit(){
return 1000;
}

@Override
public void handle(int money){
System.out.println("组长批复报销为"+ money+"元");
}
}


public class Director extends Leader{
@Override
public int limit(){
return 5000;
}

@Override
public void handle(int money){
System.out.println("主管批复报销为"+ money+"元");
}
}


public class Manager extends Leader{
@Override
public int limit(){
return 10000;
}

@Override
public void handle(int money){
System.out.println("经理批复报销为"+ money+"元");
}
}

public class Boss extends Leader{
@Override
public int limit(){
return Intege.MAX_VALUE;
}

@Override
public void handle(int money){
System.out.println("老板批复报销为"+ money+"元");
}
}

最后,小李从组长开始发起请求申请报账

public class XiaoLin{
public static void main(String[] args){
//构造各个领导对象
GroupLeader groupLeader=new GroupLeader();
Director director =new Director();
Manager manager=new Manager();
Boss boss=new Boss();
//设置上一级领导处理者对象
groupLeader.nextHandler=director;
director.nextHandler=manager;
manager.nextHandler=boss;
//发起报账申请
groupLeader.handleRequest(50000);
 }
} 

这里大家可能会想,可不可以直接越过组长找主管报账呢? 答案是肯定的,这就是责任链模式的灵活之处。

总结

就像你所知道的所有设计模式一样,有优点也有缺点,但总体来说是利大于弊。责任链的优点显而易见,可以对请求者和处理者关系解耦,提高代码的灵活性。责任链模式的最大缺点是对链中的请求处理者的遍历,如果处理者太多那么遍历必定会影响性能,特别是一些递归调用中,要慎重。

版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式之行为型模式(11种)

行为型模式 第一类:通过父类与子类的关系进行实现。第二类:两个类之间。第三类:类的状态。第四类:通过中间类 责任链模式 责任链模式说的通俗一点就是,当客户提交一个请求时,从第一个对象开始,链中收到请...
  • u012152619
  • u012152619
  • 2014年11月07日 12:04
  • 1755

GOF23设计模式之责任链模式(chain of responsibility)之实现

 /**  * 请假条  * 封装请假的信息。  */ package com.bjsxt.cn.chainOfResponsibility; public class Leave...
  • lk142500
  • lk142500
  • 2015年04月09日 15:47
  • 967

大话设计模式宏观总结——创建型&结构型&行为型

总结三种类型的设计模式的区别和联系
  • sun15732621550
  • sun15732621550
  • 2016年02月01日 12:32
  • 1696

设计模式-行为型之责任链模式

模式动机   责任链是指一系列的结点连接在一起形成一条链,每个节点有各自的职责。链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个结点都是请求...
  • ABC374744988
  • ABC374744988
  • 2015年09月10日 22:26
  • 233

设计模式(行为型)之状态模式(State Pattern)

状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态...
  • yanbober
  • yanbober
  • 2015年05月05日 15:32
  • 3892

设计模式--行为型--责任链模式

一、职责链简介(Brief Introduction)      使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一个链,并沿着这条链传递该请求,直到有一个对象...
  • acesql
  • acesql
  • 2012年11月23日 10:27
  • 334

行为型设计模式-责任链模式

责任链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止(如果权限不够则直接跳转) 责任链模式参...
  • yang1464657625
  • yang1464657625
  • 2017年03月02日 13:44
  • 160

c++设计模式之(状态模式和责任链模式)的实现

c++的设计模式系列分为以下几种: //按照目的来分,有:  (1)创建型模式:处理对象的创建过程 (2)结构型模式:处理类或者对象的组合 (3)行为型模式:对怎样交互和分...
  • Strong_HCyouth
  • Strong_HCyouth
  • 2016年11月30日 15:40
  • 509

设计模式---责任链模式(C++实现)

责任链模式(Chain of Responsibility Pattern)为请求创建一个接受者对象的链。这种模式给与请求的类型,对请求的发送者和接受者进行解耦。属于行为型模式。 在这种模式...
  • My_heart_
  • My_heart_
  • 2017年03月16日 15:48
  • 564

行为型之责任链模式

1、责任链模式:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。 职责链模式结构的...
  • aa11zhong
  • aa11zhong
  • 2017年03月19日 10:12
  • 88
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:行为型设计模式之责任链模式
举报原因:
原因补充:

(最多只允许输入30个字)