文章目录
一、命令模式简介
二、命令模式 适用场景
三、命令模式 优缺点
四、命令模式 与 备忘录模式
五、命令模式 代码示例
1、命令接口
2、发布命令类
3、关闭命令类
4、游戏类
5、命令执行者类
6、测试类
一、命令模式简介
命令模式 : 将 不同的请求 封装成 不同的请求对象 , 以便 使用 不同的 请求 ; 对于接收者来说 , 可以识别 不同的 请求对象类型 , 然后执行 不同的操作 ;
命令模式 , 解决了 应用程序 中 , 对象的职责 ( 发送请求 / 执行请求 ) , 以及它们之间的 通信方式 ;
命令模式 可以使 命令的 发送者 和 接收者 完全解耦 ; 发送者 和 接收者 之间 , 并没有直接的关系 , 二者靠 命令 进行交互 ;
命令发送者 只需要知道发送 请求对象 , 不需要知道如何完成请求 ;
命令执行者 只需要知道如何 完成请求 , 不需要知道请求的发送过程 ;
命令模式类型 : 行为型 ;
二、命令模式 适用场景
命令模式 适用场景 :
解耦发送者与接收者 : 请求发送者 和 请求接收者 ( 执行者 ) 需要 解耦 , 发送者 与 接收者 之间 不直接进行交互 ;
抽象行为 : 需要将 等待执行 的行为 抽象出来 ;
三、命令模式 优缺点
命令模式 优点 :
降低耦合 : 将 请求 调用者 与 请求 接收者 进行 解耦 ;
扩展性高 : 如果要 扩展新命令 , 直接 定义 新的命令对象 即可 ; 如果要 执行一组命令 , 发送一组命令 给接收者 即可 ;
命令模式 缺点 :
增加复杂度 : 扩展命令 会 导致 类的数量增加 , 增加了 系统实现的复杂程度 ;
需要针对每个命令 , 都要开发一个与之对应的命令类 ;
四、命令模式 与 备忘录模式
命令模式 与 备忘录模式 : 可以通过 备忘录模式 保存 命令模式 的 命令 历史记录 , 可以获取 上一个命令 , 之前的某几个命令 等 ,
五、命令模式 代码示例
命令模式 的 核心 就是 将 命令 抽象成一个对象 ;
业务场景 :
游戏的 发布 和 关闭 , 使用命令模式实现 , 分别针对 发布 , 关闭 , 各自定义一个命令类 ;
1、命令接口
package command; /** * 命令接口 * 所有的命令都要实现该接口 */ public interface Command { /** * 执行命令方法 */ void execute(); }
2、发布命令类
package command; /** * 开放命令 * 实现 Command 接口 * 该类代表了一种命令 */ public class OpenCommand implements Command{ private Game game; public OpenCommand(Game game) { this.game = game; } @Override public void execute() { this.game.open(); } }
3、关闭命令类
package command; /** * 关闭命令 */ public class CloseCommand implements Command { private Game game; public CloseCommand(Game game) { this.game = game; } @Override public void execute() { this.game.close(); } }
4、游戏类
package command; /** * 该类与命令执行的具体逻辑相关 */ public class Game { private String name; public Game(String name) { this.name = name; } public void open() { System.out.println(this.name + " 开放"); } public void close() { System.out.println(this.name + " 关闭"); } }
5、命令执行者类
package command; import java.util.ArrayList; /** * 命令接收者 * 执行命令 */ public class Manager { /** * 存放命令 */ private ArrayList<Command> commands = new ArrayList<>(); /** * 添加命令 * @param command */ public void addCommand(Command command) { commands.add(command); } /** * 执行命令 */ public void executeCommand() { for (Command command : commands) { // 逐个遍历执行命令 command.execute(); } // 命令执行完毕后 , 清空集合 commands.clear(); } }
6、测试类
package command; public class Main { public static void main(String[] args) { Game game = new Game("Game 01"); OpenCommand openCommand = new OpenCommand(game); CloseCommand closeCommand = new CloseCommand(game); // 发送命令 Manager manager = new Manager(); manager.addCommand(openCommand); manager.addCommand(closeCommand); // 执行命令 manager.executeCommand(); } }
执行结果 :
————————————————
