一、概念
- 责任链模式就是一件事多个对象处理,只有一个对象处理成功;
二、场景
- NET 中的中间件就是使用责任链模式。
- 用户登录[账号登录\手机验证登录]都得对用户进行验证是否存在、是否锁定、密码是否正确;
- 员工请假需要各级领导审批;
三、实现
- 条件
- java
- 场景
- 以员工请假,多级领导[部门主管、部门经理、老板]审批为场景。
- 实现
- 领域模型类,类名:Leave.java
package com.ResponsibilityChainPattern; public class Leave { private int Days; private String Name; public int getDays() { return Days; } public String getName() { return Name; } public void setDays(int days) { Days = days; } public void setName(String name) { Name = name; } }
- 部门主管类,类名:DepartmentLeader.java
package com.ResponsibilityChainPattern; public class DepartmentLeader extends AbstractLeave implements ILeaveHandler { private final int MAX_DAYS = 3; public DepartmentLeader(String _Name) { Name = _Name; } @Override public void LeaveHandler(Leave leave) { if (leave.getDays()<= MAX_DAYS) { System.out.print(Name+"审批成功,流程已走完!"); return ; } if (leaveHandler != null) { leaveHandler.LeaveHandler(leave); } } }
- 部门经理类,类名:DepartmentManager.java
package com.ResponsibilityChainPattern; public class DepartmentManager extends AbstractLeave implements ILeaveHandler{ private final int MAX_DAYS = 10; public DepartmentManager(String _Name) { Name = _Name; } @Override public void LeaveHandler(Leave leave) { if(leave.getDays()<= MAX_DAYS) { System.out.print(Name+"审批成功,流程已走完!"); return; } if (leaveHandler != null) { leaveHandler.LeaveHandler(leave); } } }
- 老板类,类名:Boss.java
package com.ResponsibilityChainPattern; public class Boss extends AbstractLeave implements ILeaveHandler { private final int MAX_DAYS = 30; public Boss(String _Name) { Name = _Name; } @Override public void LeaveHandler(Leave leave) { if(leave.getDays()<= MAX_DAYS) { System.out.print(Name+"审批成功,流程已走完!"); return; } } }
- 接口类,类名:ILeaveHandler.java
package com.ResponsibilityChainPattern; public interface ILeaveHandler { void LeaveHandler(Leave leave); }
- 抽象类,类名:AbstractLeave.java
package com.ResponsibilityChainPattern; public abstract class AbstractLeave { protected String Name; protected ILeaveHandler leaveHandler; public ILeaveHandler getLeaveHandler() { return leaveHandler; } public void setLeaveHandler(ILeaveHandler leaveHandler) { this.leaveHandler = leaveHandler; } }
- 入口类,类名:Main
package com; import com.ResponsibilityChainPattern.Boss; import com.ResponsibilityChainPattern.DepartmentLeader; import com.ResponsibilityChainPattern.DepartmentManager; import com.ResponsibilityChainPattern.Leave; public class Main { public static void main(String[] args) { Leave leave= new Leave(); leave.setDays(20); leave.setName("小明"); // 创建角色 DepartmentLeader dl =new DepartmentLeader("部主管"); DepartmentManager dm = new DepartmentManager("部门经理"); Boss boss= new Boss("老板"); //审批 dl.setLeaveHandler(dm); dm.setLeaveHandler(boss); dl.LeaveHandler(leave); } }
- 领域模型类,类名:Leave.java
四、优缺点
- 优点
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不需要知道链的结构。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。
- 缺点
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
- 可能不容易观察运行时的特征,有碍于除错。