将多个对象通过引用连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。对于客户来说并不知道请求在哪一个环节被处理了。从而实现了请求和处理之间的解耦合
责任链模式在处理请求的过程中,可能出现以下的情况:
如果请求能被当前handler处理,则先执行特定的处理根据处理流程,当前handler处理完成后,可能有以下两种情况:
- 可能不再向next handler传递,结束整个处理流程,如请假审批;上一级同意后,事件处理完成
- 可能继续向next handler传递,直到到达责任链末尾,如奖学金评选;上一级同意后,才能传递给下一级
如果请求不能被当前handler处理,则需要向next handler传递
可能不存在对应的handler,导致请求无法被处理
小刘作为公司一名普通员工,现在有事情需要请假,公司领导层分为:组长、部门经理、老板。其中组长可以审批3天以内的假,部门经理可以审批5天以内的假,超过5天的假必须找老板审批,超过七天的假会被拒回。公司中能跟普通员工直接工作交接的只有组长,不存在跨级工作交接的情况

Handler
- package com.behaviour.chains.common.Handler;
-
- import com.behaviour.chains.common.HolidayEvent;
-
- /**
- * 抽象处理者(Handler)
- * 供具体处理者继承,规范了每一个具体处理者的基本功能
- */
- public abstract class Handler {
-
- private Handler next;
-
- public void setNext(Handler next) {
- this.next = next;
- }
-
- public Handler getNext() {
- return next;
- }
-
- public abstract void handleRequest(HolidayEvent event);
- }
GroupLeader
- package com.behaviour.chains.common.ConcreteHandler;
-
- import com.behaviour.chains.common.Handler.Handler;
- import com.behaviour.chains.common.HolidayEvent;
-
- public class GroupLeader extends Handler {
-
- @Override
- public void handleRequest(HolidayEvent event) {
-
- if (event.getDays() <= 3){
- System.out.println(event.getName() + "同志,组长已经审批通过您长达" + event.getDays() + "天的请假申请");
-
- }else{
- getNext().handleRequest(event);
- }
- }
- }
ManageLeader
- package com.behaviour.chains.common.ConcreteHandler;
-
- import com.behaviour.chains.common.Handler.Handler;
- import com.behaviour.chains.common.HolidayEvent;
-
- public class ManageLeader extends Handler {
-
- @Override
- public void handleRequest(HolidayEvent event) {
-
- if (event.getDays() <= 5){
- System.out.println(event.getName() + "同志,项目经理已经审批通过您长达" + event.getDays() + "天的请假申请");
-
- }else{
- getNext().handleRequest(event);
- }
- }
- }
BossLeader
- package com.behaviour.chains.common.ConcreteHandler;
-
- import com.behaviour.chains.common.Handler.Handler;
- import com.behaviour.chains.common.HolidayEvent;
-
- public class BossLeader extends Handler {
-
- @Override
- public void handleRequest(HolidayEvent event) {
-
- if (event.getDays() <= 7){
- System.out.println(event.getName() + "同志,老板已经审批通过您长达" + event.getDays() + "天的请假申请");
-
- }else{
- System.out.println("请假时间过长,已被驳回");
- }
- }
- }
HolidayOA
- package com.behaviour.chains.common.Client;
-
- import com.behaviour.chains.common.ConcreteHandler.BossLeader;
- import com.behaviour.chains.common.ConcreteHandler.GroupLeader;
- import com.behaviour.chains.common.ConcreteHandler.ManageLeader;
- import com.behaviour.chains.common.HolidayEvent;
-
- /**
- * 客户类(Client):创建责任链
- * 公司OA请假系统
- */
- public class HolidayOA {
-
- private GroupLeader groupLeader;
- private ManageLeader manageLeader;
- private BossLeader bossLeader;
-
- // 构造责任链
- public HolidayOA(){
-
- this.groupLeader = new GroupLeader();
- this.manageLeader = new ManageLeader();
- this.bossLeader = new BossLeader();
-
- this.groupLeader.setNext(manageLeader);
- this.manageLeader.setNext(bossLeader);
- }
-
- // 请假事件入口
- public void doHoliday(HolidayEvent event){
-
- this.groupLeader.handleRequest(event);
- }
-
- }
HolidayEvent
- package com.behaviour.chains.common;
-
- /**
- * Handler要处理的事件
- * 请假事件
- */
- public class HolidayEvent {
-
- private String name;
- private Integer days;
-
- public HolidayEvent(String name, Integer days) {
- this.name = name;
- this.days = days;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getDays() {
- return days;
- }
-
- public void setDays(Integer days) {
- this.days = days;
- }
- }
Test
- package com.behaviour.chains.common;
-
- import com.behaviour.chains.common.Client.HolidayOA;
-
- public class Test {
-
- public static void main(String[] args) {
-
- new HolidayOA().doHoliday(new HolidayEvent("小明", 4));
- }
- }
Handler
- package com.behaviour.chains.upgrade.Handler;
-
- import com.behaviour.chains.upgrade.HolidayEvent;
-
- /**
- * 抽象处理者(Handler)
- * 供具体处理者继承,规范了每一个具体处理者的基本功能
- */
- public abstract class Handler {
-
- public abstract void handleRequest(HolidayEvent event);
- }
GroupLeader
- package com.behaviour.chains.upgrade.ConcreteHandler;
-
- import com.behaviour.chains.upgrade.Handler.Handler;
- import com.behaviour.chains.upgrade.HolidayEvent;
-
- /**
- * 具体处理者(Concrete Handler)
- * 组长
- */
- public class GroupLeader extends Handler {
-
- @Override
- public void handleRequest(HolidayEvent event) {
-
- if (event.getDays() <= 3){
- System.out.println(event.getName() + "同志,组长已经审批通过您长达" + event.getDays() + "天的请假申请");
- event.setSuccessful(true);
- }
- }
- }
ManageLeader
- package com.behaviour.chains.upgrade.ConcreteHandler;
-
- import com.behaviour.chains.upgrade.Handler.Handler;
- import com.behaviour.chains.upgrade.HolidayEvent;
-
- /**
- * 具体处理者(Concrete Handler)
- * 项目经理
- */
- public class ManageLeader extends Handler {
-
- @Override
- public void handleRequest(HolidayEvent event) {
-
- if (event.getDays() <= 5){
- System.out.println(event.getName() + "同志,项目经理已经审批通过您长达" + event.getDays() + "天的请假申请");
- event.setSuccessful(true);
- }
- }
- }
BossLeader
- package com.behaviour.chains.upgrade.ConcreteHandler;
-
- import com.behaviour.chains.upgrade.Handler.Handler;
- import com.behaviour.chains.upgrade.HolidayEvent;
-
- /**
- * 具体处理者(Concrete Handler)
- * 老板
- */
- public class BossLeader extends Handler {
-
- @Override
- public void handleRequest(HolidayEvent event) {
-
- if (event.getDays() <= 7){
- System.out.println(event.getName() + "同志,老板已经审批通过您长达" + event.getDays() + "天的请假申请");
- event.setSuccessful(true);
-
- }else {
- System.out.println(event.getName() + "同志,您的请假时间过长,已撤销申请");
- }
- }
- }
HandleChains
- package com.behaviour.chains.upgrade.ConcreteHandler;
-
- import com.behaviour.chains.upgrade.Handler.Handler;
- import com.behaviour.chains.upgrade.HolidayEvent;
- import java.util.ArrayList;
- import java.util.List;
-
- /**
- * 客户类(Client):创建责任链
- * 公司OA请假系统
- */
- public class HandleChains {
-
- private List<Handler> handlers;
-
- // 构造责任链
- public HandleChains(){
-
- handlers = new ArrayList<>();
- }
-
- public HandleChains addHandler(Handler handler){
- this.handlers.add(handler);
- return this;
- }
-
- public void execHandler(HolidayEvent event){
- for (Handler handler : this.handlers) {
- if (!event.getSuccessful()){
- handler.handleRequest(event);
- }
- }
- }
-
- }
HolidayOA
- package com.behaviour.chains.upgrade.Client;
-
- import com.behaviour.chains.upgrade.ConcreteHandler.BossLeader;
- import com.behaviour.chains.upgrade.ConcreteHandler.GroupLeader;
- import com.behaviour.chains.upgrade.ConcreteHandler.HandleChains;
- import com.behaviour.chains.upgrade.ConcreteHandler.ManageLeader;
- import com.behaviour.chains.upgrade.HolidayEvent;
-
- /**
- * 客户类(Client):创建责任链
- * 公司OA请假系统
- */
- public class HolidayOA {
-
- private HandleChains chains;
-
- public HolidayOA(){
- chains = new HandleChains()
- .addHandler(new GroupLeader())
- .addHandler(new ManageLeader())
- .addHandler(new BossLeader());
- }
-
- public void doHoliday(HolidayEvent event){
-
- this.chains.execHandler(event);
- }
- }
HolidayEvent
- package com.behaviour.chains.upgrade;
-
- /**
- * Handler要处理的事件
- * 请假事件
- */
- public class HolidayEvent {
-
- private String name;
- private Integer days;
- private Boolean isSuccessful;
-
- public HolidayEvent(String name, Integer days) {
- this.name = name;
- this.days = days;
- this.isSuccessful = false;
- }
-
- public String getName() {
- return name;
- }
-
- public Integer getDays() {
- return days;
- }
-
- public Boolean getSuccessful() {
- return isSuccessful;
- }
-
- public void setSuccessful(Boolean successful) {
- isSuccessful = successful;
- }
- }
Test
- package com.behaviour.chains.upgrade;
-
- import com.behaviour.chains.upgrade.Client.HolidayOA;
-
- public class Test {
-
- public static void main(String[] args) {
-
- new HolidayOA().doHoliday(new HolidayEvent("小刘", 6));
- }
- }