【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); // 触发最终逻辑()
运行测试结果

命令模式
定义
命令模式(Command Pattern)是一种行为设计模式,它将请求封装为独立对象,从而支持请求的排队、记录、撤销和重做等操作。
核心角色
- Command(命令接口):声明执行操作的接口。
- ConcreteCommand(具体命令):实现命令接口,绑定接收者与动作。
- Invoker(调用者):请求命令对象执行请求。
- Receiver(接收者):知道如何执行请求的具体操作。
- 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(); // 关灯命令
运行结果:

有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

浙公网安备 33010602011771号