什么是链
1、链是一系列节点的集合。
2.、链的各节点可灵活拆分再重组。
职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,
将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
角色
抽象处理者角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
具体处理者角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
应用
员工请假管理,员工请假流程一般是:员工填写纸质请假单或者电子申请单、邮件申请,根据不同的请假天数提交给不同上级领导。上级领导审批通过,纸质请假单签字通过,电子申请或者邮件需流程走完之后,上级领导审批结束即可。
抽象处理者角色类
package test.demo;
public abstract class User {
protected User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//员工请假
public abstract String getLeave(String name,double day);
}
具体处理者角色1
package test.demo;
public class ProjectManager extends User {
@Override
public String getLeave(String name, double day) {
String str = "";
if (null == name || day < 0)
return str;
//请假天数
if (day <= 5) {
//为了测试用户名简单点,
if ("zhangsan".equals(name)) {
str = "success:Projectmanager同意" + name + "请假" + day + "天";
} else {
str = "fail:Projectmanager不同意" + name + "请假" + day + "天";
}
}else{
//超过请假天数,往上一级领导提交
if(null != getUser()){
return getUser().getLeave(name, day);
}
}
return str;
}
}
具体处理者角色2
package test.demo;
public class Deptmanager extends User {
@Override
public String getLeave(String name, double day) {
String str = "";
if (null == name || day < 0)
return str;
if (day <= 10) {
if ("zhangsan".equals(name)) {
str = "success:Deptmanager同意" + name + "请假" + day + "天";
} else {
str = "fail:Deptmanager不同意" + name + "请假" + day + "天";
}
}else{
//超过请假天数,往上一级领导提交
if(null != getUser()){
return getUser().getLeave(name, day);
}
}
return str;
}
}
具体处理者角色3
package test.demo;
public class Boss extends User {
@Override
public String getLeave(String name, double day) {
String str = "";
if (null == name || day < 0)
return str;
if (day <= 15) {
if ("zhangsan".equals(name)) {
str = "success:Boss同意" + name + "请假" + day + "天";
} else {
str = "fail:Boss不同意" + name + "请假" + day + "天";
}
}
return str;
}
}
客户端
package test.demo;
public class Test {
public static void main(String[] args) {
User user1 = new Boss();
User user2 = new Deptmanager();
User user3 = new ProjectManager();
System.out.println("-----向项目PM请假-----");
String test1 = user3.getLeave("zhangsan",4.5);
System.out.println("test1"+test1);
String test2 = user3.getLeave("lisi", 3);
System.out.println("test2"+test2);
System.out.println("-----向部门PM请假-----");
String test3 = user2.getLeave("zhangsan", 8);
System.out.println("test3"+test3);
String test4 = user2.getLeave("zhouqi", 5.5);
System.out.println("test4"+test4);
System.out.println("-----向老板请假-----");
String test5 = user1.getLeave("zhangsan", 14);
System.out.println("test5"+test5);
String test6 = user1.getLeave("wanger", 11.5);
System.out.println("test6"+test6);
}
}
测试结果
![](https://img-blog.csdn.net/20160815114445143?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
应用
员工请假管理,员工请假流程一般是:员工填写纸质请假单或者电子申请单、邮件申请,根据不同的请假天数提交给不同上级领导。上级领导审批通过,纸质请假单签字通过,电子申请或者邮件需流程走完之后,上级领导审批结束即可。
抽象处理者角色类
package test.demo;
public abstract class User {
protected User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//员工请假
public abstract String getLeave(String name,double day);
}
具体处理者角色1
package test.demo;
public class ProjectManager extends User {
@Override
public String getLeave(String name, double day) {
String str = "";
if (null == name || day < 0)
return str;
//请假天数
if (day <= 5) {
//为了测试用户名简单点,
if ("zhangsan".equals(name)) {
str = "success:Projectmanager同意" + name + "请假" + day + "天";
} else {
str = "fail:Projectmanager不同意" + name + "请假" + day + "天";
}
}else{
//超过请假天数,往上一级领导提交
if(null != getUser()){
return getUser().getLeave(name, day);
}
}
return str;
}
}
具体处理者角色2
package test.demo;
public class Deptmanager extends User {
@Override
public String getLeave(String name, double day) {
String str = "";
if (null == name || day < 0)
return str;
if (day <= 10) {
if ("zhangsan".equals(name)) {
str = "success:Deptmanager同意" + name + "请假" + day + "天";
} else {
str = "fail:Deptmanager不同意" + name + "请假" + day + "天";
}
}else{
//超过请假天数,往上一级领导提交
if(null != getUser()){
return getUser().getLeave(name, day);
}
}
return str;
}
}
具体处理者角色3
package test.demo;
public class Boss extends User {
@Override
public String getLeave(String name, double day) {
String str = "";
if (null == name || day < 0)
return str;
if (day <= 15) {
if ("zhangsan".equals(name)) {
str = "success:Boss同意" + name + "请假" + day + "天";
} else {
str = "fail:Boss不同意" + name + "请假" + day + "天";
}
}
return str;
}
}
客户端
package test.demo;
public class Test {
public static void main(String[] args) {
User user1 = new Boss();
User user2 = new Deptmanager();
User user3 = new ProjectManager();
System.out.println("-----向项目PM请假-----");
String test1 = user3.getLeave("zhangsan",4.5);
System.out.println("test1"+test1);
String test2 = user3.getLeave("lisi", 3);
System.out.println("test2"+test2);
System.out.println("-----向部门PM请假-----");
String test3 = user2.getLeave("zhangsan", 8);
System.out.println("test3"+test3);
String test4 = user2.getLeave("zhouqi", 5.5);
System.out.println("test4"+test4);
System.out.println("-----向老板请假-----");
String test5 = user1.getLeave("zhangsan", 14);
System.out.println("test5"+test5);
String test6 = user1.getLeave("wanger", 11.5);
System.out.println("test6"+test6);
}
}
测试结果
职责链灵活在哪
1. 改变内部的传递规则
在内部,项目经理完全可以跳过人事部到那一关直接找到部门经理。
每个人都可以去动态地指定他的继任者。
2. 可以从职责链任何一关开始。
如果项目经理不在,可以直接去找部门经理,责任链还会继续,没有影响。
3.用与不用的区别
不用职责链的结构,我们需要和公司中的每一个层级都发生耦合关系。
如果反映在代码上即使我们需要在一个类中去写上很多丑陋的if….else语句。
如果用了职责链,相当于我们面对的是一个黑箱,我们只需要认识其中的一个部门,然后让黑箱内部去负责传递就好了
纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又 把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。