责任链模式(请求处理建立链)
Posted 千彧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了责任链模式(请求处理建立链)相关的知识,希望对你有一定的参考价值。
从名字中看出 ,系统中将会存在多个有类似处理能力的对象,当一个请求触发后,请求将在这些对象组成的链条中传递直到找到最合适的处理对象,并进行处理。
责任链模式是一种对象的行为模式,通常分为纯的责任模式和不纯的责任模式。
纯的责任链模式:
要求一个对象处理者只能选择不处理或者处理全部。且要求一个请求必须被某一个处理者所处理,不能出现请求为被处理的情况。
不纯的责任链模式:
允许一个请求被某个处理者处理部分,在向后传递。且一个请求允许不被任何处理者所处理。
假设在一个公司中某职员需要向上级申请资金主要有 项目经理、部门经理、总经理可以批准。 其中项目经理可批准500以内,部门经理可批准1000以内的,总经理可以批准任何资金。
在不使用责任链模式时我们可以用if else 一一作出判断,而如果后来的申请流程发生改变,我们必须对原有的判断逻辑作出修改。
使用责任链模式时我们可以将各个处理对象连成链而随意组合,而在以后发生变动时我们只需要对链的顺序做出重组,而不需要修在原来的逻辑代码。
抽象处理者:
1 public abstract class Handler { 2 protected Handler successor = null; //用于组成处理链 3 4 public Handler getSuccessor() { 5 return successor; 6 } 7 8 public void setSuccessor(Handler successor) { 9 this.successor = successor; 10 } 11 public abstract String handlerFeeRequest(String user,double fee);//处理函数 12 13 }
具体处理者:
1 public class ProjectManager extends Handler { 2 3 @Override 4 public String handlerFeeRequest(String user, double fee) { 5 String str= null; 6 if (fee<=500) { 7 str = "项目经理同意 ,费用为:" + fee; //如果五百以内项目经理可以处理 8 }else { 9 str = successor.handlerFeeRequest(user, fee);//超过五百需要交给他人处理 10 } 11 return str; 12 } 13 14 }
1 public class DeptManager extends Handler { 2 3 4 @Override 5 public String handlerFeeRequest(String user, double fee) { 6 String str= null; 7 if (fee<=1000) { 8 str = "部门经理同意, 费用为:" + fee; //如果一千以内部门经理可以处理 9 }else { 10 str = successor.handlerFeeRequest(user, fee);//超过一千需要交给他人处理 11 } 12 return str; 13 } 14 15 16 17 18 }
1 public class GeneralManager extends Handler{ 2 3 4 @Override 5 public String handlerFeeRequest(String user, double fee) { 6 String str= null; 7 8 str = "总经理同意, 费用为:" + fee; //总经理经理可以处理任意数目 9 10 return str; 11 } 12 13 14 }
客户测试类:
1 import javax.swing.text.html.HTMLDocument.HTMLReader.HiddenAction; 2 3 public class ResponsibilityChain { 4 5 public static void main(String[] args) { 6 7 Handler h1 = new ProjectManager();//创建项目经理 8 Handler h2 = new DeptManager();//创建部门经理 9 Handler h3 = new GeneralManager();//创建总经理 10 11 /* 12 * 建立处理链 13 */ 14 h1.setSuccessor(h2); 15 h2.setSuccessor(h3); 16 /* 17 * 处理 18 * 统一的调用 h1 作为请求入口 如果不做出标注 客户不会知道具体的处理者是谁 19 */ 20 String resault; 21 resault = h1.handlerFeeRequest("张三",400); 22 System.out.println(resault); 23 resault = h1.handlerFeeRequest("张三",800); 24 System.out.println(resault); 25 resault = h1.handlerFeeRequest("张三",1200); 26 System.out.println(resault); 27 } 28 29 }
运行结果:
项目经理同意 ,费用为:400.0 部门经理同意, 费用为:800.0 总经理同意, 费用为:1200.0
以上是关于责任链模式(请求处理建立链)的主要内容,如果未能解决你的问题,请参考以下文章