将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。
【角色】
- 客户端(Client):实例化一个处理器的链,在第一个链对象中调用handleRequest方法。
- 处理器(Handler):抽象类,提供给实际处理器继承然后实现handleRequst方法,处理请求。
具体处理器(ConcreteHandler):继承了handler的类,同时实现handleRequst方法,负责处理业务逻辑类,不同业务模块有不同的ConcreteHandler。
/*** 抽象处理器*/public abstract class Handler {/*** 下一个处理器*/protected Handler handler;public void setHandler(Handler handler) {this.handler = handler;}public abstract void handleRequest(Integer days);}
/*** 组长*/public class LeaderHandler extends Handler {@Overridepublic void handleRequest(Integer days) {if (days == 1) {System.out.println("请假时间为1天,等待组长审批!");} else {handler.handleRequest(days);}}}
/*** 项目经理*/public class ManagerHandler extends Handler {@Overridepublic void handleRequest(Integer days) {if (days == 2) {System.out.println("请假时间为2天,等待项目经理审批!");} else {handler.handleRequest(days);}}}
/*** CTO*/public class CTOHandler extends Handler {@Overridepublic void handleRequest(Integer days) {if (days > 2) {System.out.println("请假时间超过2天,等待CTO审批!");} else {handler.handleRequest(days);}}}
/*** 请假管理*/public class LeaveClient {private Handler handler;public LeaveClient() {// ctoCTOHandler ctoHandler = new CTOHandler();// 经理ManagerHandler managerHandler = new ManagerHandler();// 组长LeaderHandler leaderHandler = new LeaderHandler();// 构建一条责任链leaderHandler.setHandler(managerHandler);managerHandler.setHandler(ctoHandler);ctoHandler.setHandler(leaderHandler);// 默认处理器随便用哪个handler = leaderHandler;}/*** 请假*/public void apply(Integer days) {handler.handleRequest(days);}}
public class ChainTest {public static void main(String[] args) {LeaveClient leaveClient = new LeaveClient();leaveClient.apply(1);leaveClient.apply(2);leaveClient.apply(3);leaveClient.apply(4);}}----输出----请假时间为1天,等待组长审批!请假时间为2天,等待项目经理审批!请假时间超过2天,等待CTO审批!请假时间超过2天,等待CTO审批!
