命令模式
基本介绍
命令模式:将 不同的请求 封装成 不同的请求对象 , 以便 使用 不同的 请求 ; 对于接收者来说 , 可以识别 不同的 请求对象类型 , 然后执行 不同的操作 ;
命令模式 , 解决了 应用程序 中 , 对象的职责 ( 发送请求 / 执行请求 ) , 以及它们之间的 通信方式 ;
命令模式 可以使 命令的 发送者 和 接收者 完全解耦 ; 发送者 和 接收者 之间 , 并没有直接的关系 , 二者靠 命令 进行交互 ;
命令发送者 只需要知道发送 请求对象 , 不需要知道如何完成请求 ;
命令执行者 只需要知道如何 完成请求 , 不需要知道请求的发送过程 ;
命令模式类型:行为模式
命令模式适用场景
命令模式 适用场景 :
- 解耦发送者与接收者 : 请求发送者 和 请求接收者 ( 执行者 ) 需要 解耦 , 发送者 与 接收者 之间 不直接进行交互 ;
- 抽象行为 : 需要将 等待执行 的行为 抽象出来
命令模式优缺点
命令模式优点
- 降低耦合 : 将 请求 调用者 与 请求 接收者 进行 解耦 ;
- 扩展性高 : 如果要 扩展新命令 , 直接 定义 新的命令对象 即可 ; 如果要 执行一组命令 , 发送一组命令 给接收者 即可 ;
命令模式缺点** 😗*
- 增加复杂度 : 扩展命令 会 导致 类的数量增加 , 增加了 系统实现的复杂程度 ;
- 需要针对每个命令 , 都要开发一个与之对应的命令类 ;
示例代码
命令模式 的 核心 就是 将 命令 抽象成一个对象 ;
业务场景:游戏的 开启 和 关闭 , 使用命令模式实现 , 分别针对 发布 , 关闭 , 各自定义一个命令类 ;
- 首先定一个游戏类
/**
* 该类与命令执行的具体逻辑相关
*/
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 + " 关闭");
}
}
- 命令接口,所有命令都要实现这个接口
/**
* 命令接口
* 所有的命令都要实现该接口
*/
public interface Command {
/**
* 执行命令方法
*/
void execute();
}
- 开启游戏命令类
/**
* 开启游戏命令
* 实现 Command 接口
* 该类代表了一种命令
*/
public class OpenCommand implements Command{
private Game game;
public OpenCommand(Game game) {
this.game = game;
}
@Override
public void execute() {
this.game.open();
}
}
- 关闭游戏命令类
/**
* 关闭命令
*/
public class CloseCommand implements Command {
private Game game;
public CloseCommand(Game game) {
this.game = game;
}
@Override
public void execute() {
this.game.close();
}
}
- 命令执行类
/**
* 命令接收者
* 执行命令
*/
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();
}
}
- 测试类
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();
}
}