【Java】23种设计模式——17.责任链模式18.命令模式

责任链模式和命令模式的目的是将发送者和接收者解耦。责任链模式的接收者由链决定处理者关注请求和传递;命令模式由明确的接收者,支持撤销和排队。

责任链:审批流程
命令模式:任务队列

责任链模式

定义

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于将请求的发送者和接收者解耦,通过多个对象组成的链式结构依次处理请求,直到有对象处理为止。

角色

  • 抽象处理者(Handler
    定义处理请求的标准接口,通常包含设置后继处理者的方法和抽象处理逻辑方法14。

    具体处理者(ConcreteHandler
    实现抽象处理者的接口,判断自身是否能处理请求,否则将请求转给后继者45。

    客户端(Client
    负责组装处理链并向链首发送请求45。

应用场景

  • 多级审批流程(如请假、报销),需要主机传递请求。
  • 数据校验场景(如字段非空、格式、长度等动态组合的校验规则)
  • 请求处理逻辑需要动态扩展或修改,且不希望耦合发送者和接收者。

使用

多级审批的责任者模式

  • 抽象处理者

    /**
     *  责任者模式:抽象处理者
     * @Author:lyj
     * @Date:2025/5/20 15:58
     */
    public abstract class Handler {
        protected Handler nextHandler;
        /**
         * 设置下一个处理者
         * @param nextHandler
         */
        public void setNextHandler(Handler nextHandler)
        {
            this.nextHandler = nextHandler;
        }
    
        /**
         * 请求处理
         * @param days 请求天数
         */
        public abstract void handleRequest(int days);
    
    }
    
  • 具体处理者 (组长、经理、总监)

    /**
     * 责任者模式-具体处理者:组长
     * @Author:lyj
     * @Date:2025/5/20 16:00
     */
    public class GroupLeaderHandler extends Handler {
        /**
         * 处理请假请求
         * @param days 请假天数
         */
        @Override
        public void handleRequest(int days) {
            if (days <= 3) {
                System.out.println("组长审批通过,请假天数:" + days);
            }else if (nextHandler != null){
                nextHandler.handleRequest(days);
            }else {
                System.out.println("组长下一节点没有审判者,无法审批");
            }
        }
    }
    
    /**
     * 责任链模式-具体处理者:经理
     * @Author:lyj
     * @Date:2025/5/20 16:03
     */
    public class ManagerHandler extends Handler{
        @Override
        public void handleRequest(int days) {
            if (days <= 7) {
                System.out.println("经理审批通过,请假天数:" + days);
            } else if (nextHandler != null) {
                nextHandler.handleRequest(days);
            }else {
                System.out.println("经理下一节点没有审判者,无法处理");
            }
        }
    }
    
    /**
     * 责任者模式-具体处理者:总监
     * @Author:lyj
     * @Date:2025/5/20 16:05
     */
    public class DirectorHandler extends Handler{
        @Override
        public void handleRequest(int days) {
            if (days <= 15) {
                System.out.println("总监审批通过,请假天数:" + days);
            }else {
                System.out.println("请假天数过长,需最高老板决定,无法审批");
            }
        }
    }
    

测试客户端:

// 新建审批者(具体处理者)
Handler  groupLeaderHandler = new GroupLeaderHandler();
Handler  managerHandler = new ManagerHandler();
Handler  directorHandler = new DirectorHandler();
// 构建责任链
groupLeaderHandler.setNextHandler(managerHandler);
managerHandler.setNextHandler(directorHandler);
// 提交请求
groupLeaderHandler.handleRequest(1);    // 组长处理
groupLeaderHandler.handleRequest(5);    // 经理处理
groupLeaderHandler.handleRequest(10);   // 总监处理
groupLeaderHandler.handleRequest(20);   // 触发最终逻辑()

运行测试结果
image

命令模式

定义

命令模式(Command Pattern)是一种行为设计模式,它将请求封装为独立对象,从而支持请求的排队、记录、撤销和重做等操作。

核心角色

  1. Command(命令接口):声明执行操作的接口。
  2. ConcreteCommand(具体命令):实现命令接口,绑定接收者与动作。
  3. Invoker(调用者):请求命令对象执行请求。
  4. Receiver(接收者):知道如何执行请求的具体操作。
  5. Client(客户端):创建具体命令对象并设置接收者。

应用场景

  • 需要实现操作撤销/重做功能。
  • 需要将操作或记录日志。
  • 需要支持事务操作。
  • 需要实现回调机制。

使用

  • 命令接口

    /**
     * 命令模式:命令接口
     * @Author:lyj
     * @Date:2025/5/20 17:26
     */
    public interface Command {
        /**
         * 执行命令
         */
        public void execute();
        /**
         * 撤销命令
         */
        public void undo();
    }
    
  • 接收者

    /**
     * 命令模式-调用者: 灯
     * @Author:lyj
     * @Date:2025/5/20 17:28
     */
    public class Light {
        /**
         * 开灯
         */
        public void on() {
            System.out.println("灯亮了");
        }
    
        /**
         * 关灯
         */
        public void off() {
            System.out.println("灯灭了");
        }
    }
    
  • 具体命令

    /**
     * 命令模式-具体命令:灯的开关
     * @Author:lyj
     * @Date:2025/5/20 17:30
     */
    public class LightOnCommand implements Command{
        private Light light;
        public LightOnCommand(Light light){
            this.light = light;
        }
    
        /**
         * 执行命令:开灯
         */
        @Override
        public void execute() {
            light.on();
        }
    
        /**
         * 撤销命令:关灯
         */
        @Override
        public void undo() {
            light.off();
        }
    }
    
  • 调用者

    /**
     * 命令模式-调用者:负责命令执行
     * @Author:lyj
     * @Date:2025/5/20 17:34
     */
    public class RemoteControl {
        private Command command;    // 持有的命令对象
    
        /**
         * 设置命令对象
         * @param command 命令对象
         */
        public void setCommand(Command command) {
            this.command = command;
        }
    
        /**
         * 执行命令
         */
        public void pressButton() {
            command.execute();
        }
    
        /**
         * 撤销命令
         */
        public void undoButton() {
            command.undo();
        }
    }
    

运行客户端

// 创建接收者
Light light = new Light();
// 创建具体命令并绑定接收者
Command lightOnCommand = new LightOnCommand(light);
// 创建调用者
RemoteControl remoteControl = new RemoteControl();
remoteControl.setCommand(lightOnCommand);
// 测试命令的执行和撤销
remoteControl.pressButton();    // 开灯命令
remoteControl.undoButton();     // 关灯命令

运行结果:
image

posted @ 2025-06-20 16:52  陆陆无为而治者  阅读(38)  评论(0)    收藏  举报