1.责任链模式
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。由于英文翻译的不同,职责链模式又称为责任链模式,它是一种对象行为型模式。
职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。 链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。
职责链模式包含如下角色: - Handler: 抽象处理者 - ConcreteHandler: 具体处理者 - Client: 客户类
2.实例
某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批;如果超过30天,总经理也不能审批,提示相应的拒绝信息。

项目结构图如下:

领导抽象类
public abstract class Leader {
protected String name;
protected Leader successor;//上级领导
public Leader(String name) {
super();
this.name = name;
}
public void setSuccessor(Leader successor) {
this.successor = successor;
}
public abstract void handleRequest(LeaveRequest leaveRequest);
}
设计请假请求类
public class LeaveRequest {
private String employeeName;
private int leaveDays;
public LeaveRequest(String employeeName, int leaveDays) {
super();
this.employeeName = employeeName;
this.leaveDays = leaveDays;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String leaveName) {
this.employeeName = employeeName;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
}
直接领导类
public class Director extends Leader {
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if(leaveRequest.getLeaveDays()<3){
System.out.println("直接领导:"+this.name+"审批员工"+leaveRequest.getEmployeeName()+"的假条,请求天数为:"+leaveRequest.getLeaveDays()+"天!");
}else{
if(this.successor!=null){
this.successor.handleRequest(leaveRequest);
}
}
}
}
经理类
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if(leaveRequest.getLeaveDays()<10){
System.out.println("经理:"+this.name+"审批员工"+leaveRequest.getEmployeeName()+"的请假条,请假天数为:"+leaveRequest.getLeaveDays()+"天。");
}else{
if(this.successor!=null){
this.successor.handleRequest(leaveRequest);
}
}
}
}
副总经理类
public class ViceGeneralManager extends Leader {
public ViceGeneralManager(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if(leaveRequest.getLeaveDays()<20){
System.out.println("副总经理:"+this.name+"审批员工"+leaveRequest.getEmployeeName()+"的请假条,请假时间为:"+leaveRequest.getLeaveDays()+"天。");
}else{
if(this.successor!=null){
this.successor.handleRequest(leaveRequest);
}
}
}
}
总经理类
public class GeneralManager extends Leader {
public GeneralManager(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if(leaveRequest.getLeaveDays()<30){
System.out.println("总经理:"+this.name+"审批员工"+leaveRequest.getEmployeeName()+"的请假条,请假时间为:"+leaveRequest.getLeaveDays()+"天。");
}else{
System.out.println("莫非"+leaveRequest.getEmployeeName()+"想辞职,居然请假 "+leaveRequest.getLeaveDays()+"天。");
}
}
}
测试类
public class TestChainDemo01 {
public static void main(String[] args) {
Leader director=new Director("王明直接领导");
Leader manager=new Manager("赵强经理");
Leader viceManager=new ViceGeneralManager("肖宏副总经理");
Leader generalManager=new GeneralManager("李波总经理");
//设置领导对应关系链
director.setSuccessor(manager);
manager.setSuccessor(viceManager);
viceManager.setSuccessor(generalManager);
LeaveRequest lr1=new LeaveRequest("张三", 2);
director.handleRequest(lr1);
LeaveRequest lr2=new LeaveRequest("李四", 5);
director.handleRequest(lr2);
LeaveRequest lr3=new LeaveRequest("王五", 15);
director.handleRequest(lr3);
LeaveRequest lr4=new LeaveRequest("马六", 25);
director.handleRequest(lr4);
LeaveRequest lr5=new LeaveRequest("钱七", 35);
director.handleRequest(lr5);
}
}
运行结果:
直接领导:王明直接领导审批员工张三的假条,请求天数为:2天!
经理:赵强经理审批员工李四的请假条,请假天数为:5天。
副总经理:肖宏副总经理审批员工王五的请假条,请假时间为:15天。
总经理:李波总经理审批员工马六的请假条,请假时间为:25天。
莫非钱七想辞职,居然请假 35天。