设计模式——责任链模式
责任链模式是一种行为模式,由许多可以处理同一件事情的对象,组成一个链状结构,每一个对象记录其下一个对象的引用,用于传递请求;
请求在这个链上传递,直到被处理或者是不能处理,返回!tomcat的servlet,Struts的filter都采用了责任链的设计模式。
以领导批复员工请假为例:
项目经理 部门经理 boss都可以批准请假,但处理请假的权限和处理方式可能略有不同;如项目经理只能处理1天以下的请假,部门经理只能处理5天以下的请假... ...
责任链模式一般包含两种角色:
1、处理事情的抽象类(约束了对象需要实现的具体方法及对象需要记录有其下级处理对象)
2、处理事情的具体对象(至少由两个不同类)
下面看具体实现:
首先定义抽象类
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.chain; /** * @description 责任角色的抽象类 * @author panteng * @date 17-2-21. */ public abstract class Leader { public Leader upLeader; //上级领导 public Leader getUpLeader(){ return upLeader; } public void setUpLeader(Leader upLeader){ this.upLeader = upLeader; } //请假处理 abstract void officialReply(String name, float days, String leaveReason); }
定义三个具体的处理类:项目主管 部门主管 Boss
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.chain; /** * @description 项目经理 * @author panteng * @date 17-2-21. */ public class ProjectLeader extends Leader { /** * 小于1天 直接批准,大于1天,交由上级领导批准 * @param name * @param days * @param leaveReason */ @Override void officialReply(String name, float days, String leaveReason){ if (days <= 1) { System.out.println("批准 " + name + "请假"); } else { if (this.getUpLeader() != null) { this.getUpLeader().officialReply(name, days, leaveReason); } else { System.out.println("ProjectLeader的领导不在 无法处理"); } } } }
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.chain; /** * @description 部门领导 * @author panteng * @date 17-2-21. */ public class DevLeader extends Leader { /** * 小于5天,自己处理;如果是带薪或者必须,批准 否则不批准 * 大于5天,交由上级领导处理 * @param name * @param days * @param leaveReason */ @Override void officialReply(String name, float days, String leaveReason){ if (days <= 5) { if ("法定带薪假".equals(leaveReason) || "必须".equals(leaveReason)) { System.out.println("批准 " + name + "请假"); } else { System.out.println("不批准 " + name + "请假"); } } else { if (this.getUpLeader() != null) { this.getUpLeader().officialReply(name, days, leaveReason); } else { System.out.println("DevLeader的领导不在 无法处理"); } } } }
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.chain; /** * @description * @author panteng * @date 17-2-21. */ public class BossLeader extends Leader { /** * 小于5天 直接批准,大于5天必须是法定或者必须型假期才批准 * @param name * @param days * @param leaveReason */ @Override void officialReply(String name, float days, String leaveReason){ if (days < 5) { System.out.println("批准 " + name + "请假"); return; } if ("法定带薪假".equals(leaveReason) || "必须".equals(leaveReason)) { System.out.println("批准 " + name + "请假"); return; } System.out.println("不批准 " + name + "请假"); } }
测试:
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.chain; import org.junit.Test; /** * @description * @author panteng * @date 17-2-21. */ public class ResponsibilityChainTest { @Test public void responsibilityChainTest(){ ProjectLeader projectLeader = new ProjectLeader(); DevLeader devLeader = new DevLeader(); BossLeader bossLeader = new BossLeader(); projectLeader.setUpLeader(devLeader); devLeader.setUpLeader(bossLeader); projectLeader.officialReply("张三", 1, "身体不适"); projectLeader.officialReply("李四", 3, "回家"); projectLeader.officialReply("王五", 7, "法定带薪假"); projectLeader.officialReply("李四", 3, "必须"); } }
===========================设计模式系列文章=========================