将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

    【角色】

    • 客户端(Client):实例化一个处理器的链,在第一个链对象中调用handleRequest方法。
    • 处理器(Handler):抽象类,提供给实际处理器继承然后实现handleRequst方法,处理请求。
    • 具体处理器(ConcreteHandler):继承了handler的类,同时实现handleRequst方法,负责处理业务逻辑类,不同业务模块有不同的ConcreteHandler。

      1. /**
      2. * 抽象处理器
      3. */
      4. public abstract class Handler {
      5. /**
      6. * 下一个处理器
      7. */
      8. protected Handler handler;
      9. public void setHandler(Handler handler) {
      10. this.handler = handler;
      11. }
      12. public abstract void handleRequest(Integer days);
      13. }
      1. /**
      2. * 组长
      3. */
      4. public class LeaderHandler extends Handler {
      5. @Override
      6. public void handleRequest(Integer days) {
      7. if (days == 1) {
      8. System.out.println("请假时间为1天,等待组长审批!");
      9. } else {
      10. handler.handleRequest(days);
      11. }
      12. }
      13. }
      1. /**
      2. * 项目经理
      3. */
      4. public class ManagerHandler extends Handler {
      5. @Override
      6. public void handleRequest(Integer days) {
      7. if (days == 2) {
      8. System.out.println("请假时间为2天,等待项目经理审批!");
      9. } else {
      10. handler.handleRequest(days);
      11. }
      12. }
      13. }
      1. /**
      2. * CTO
      3. */
      4. public class CTOHandler extends Handler {
      5. @Override
      6. public void handleRequest(Integer days) {
      7. if (days > 2) {
      8. System.out.println("请假时间超过2天,等待CTO审批!");
      9. } else {
      10. handler.handleRequest(days);
      11. }
      12. }
      13. }
      1. /**
      2. * 请假管理
      3. */
      4. public class LeaveClient {
      5. private Handler handler;
      6. public LeaveClient() {
      7. // cto
      8. CTOHandler ctoHandler = new CTOHandler();
      9. // 经理
      10. ManagerHandler managerHandler = new ManagerHandler();
      11. // 组长
      12. LeaderHandler leaderHandler = new LeaderHandler();
      13. // 构建一条责任链
      14. leaderHandler.setHandler(managerHandler);
      15. managerHandler.setHandler(ctoHandler);
      16. ctoHandler.setHandler(leaderHandler);
      17. // 默认处理器随便用哪个
      18. handler = leaderHandler;
      19. }
      20. /**
      21. * 请假
      22. */
      23. public void apply(Integer days) {
      24. handler.handleRequest(days);
      25. }
      26. }
      1. public class ChainTest {
      2. public static void main(String[] args) {
      3. LeaveClient leaveClient = new LeaveClient();
      4. leaveClient.apply(1);
      5. leaveClient.apply(2);
      6. leaveClient.apply(3);
      7. leaveClient.apply(4);
      8. }
      9. }
      10. ----输出----
      11. 请假时间为1天,等待组长审批!
      12. 请假时间为2天,等待项目经理审批!
      13. 请假时间超过2天,等待CTO审批!
      14. 请假时间超过2天,等待CTO审批!