1.命令模式概念
将请求封装为对象,从而使你能够将请求参数化、延迟请求的执行或将请求放入队列中。命令模式可以将请求发送者与请求接收者解耦,使它们之间不需要直接交互。
2.命令模式的基本概念
1)Command(命令接口)
定义了一个执行命令的接口,通常包含一个 execute 方法。
2)ConcreteCommand(具体命令)
实现了 Command 接口,负责设置接收者,并调用接收者的相应方法来完成请求。
3)Receiver(接收者)
执行与请求相关的操作。
4)Invoker(调用者)
请求发送者,负责调用命令对象的 execute 方法。
5)Client(客户端)
创建具体命令对象,并将其传递给调用者。
3.举个栗子:
以封装不同角色的指令请求为例
不同角色指令 ===》封装 ===》封装角色指令集合==》角色指令执行者===》执行封装角色指令
注:如果使用前后端的请求来解释,比较合适,前端的请求 是封装过的命令,使用消息队列rabbitMq收集前端的请求,然后通过rabbitMq转发给后端,后端接受到请求,就会执行响应的操作。
4.代码实现
1)命令接口代码实现
package org.xiji.command;
/**
* 指令接口
*/
public interface Command {
/**
* 第一个技能
*/
void firstSkill();
/**
* 第二个技能
*/
void secondSkill();
/**
* 第三个技能
*/
void thirdSkill();
/**
* 第四个技能
*/
void fourthSkill();
}
2)ConcreteCommand代码实现
package org.xiji.command;
/**
* 指令封装
*/
public class GameRoleCommand implements Command{
/**
*
*/
private GameRole gameRole;
public GameRoleCommand() {
}
public GameRoleCommand(GameRole gameRole) {
this.gameRole = gameRole;
}
public GameRole getGameRole() {
return gameRole;
}
public void setGameRole(GameRole gameRole) {
this.gameRole = gameRole;
}
@Override
public void firstSkill() {
this.gameRole.firstSkill();
}
@Override
public void secondSkill() {
this.gameRole.secondSkill();
}
@Override
public void thirdSkill() {
this.gameRole.thirdSkill();
}
@Override
public void fourthSkill() {
this.gameRole.fourthSkill();
}
}
3)Receiver代码实现
package org.xiji.command;
/**
* 游戏角色
*/
public class GameRole {
/**
* 角色名字
*/
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public GameRole() {
}
public GameRole(String name) {
this.name = name;
}
/**
* 第一个技能
*/
public void firstSkill() {
System.out.println(this.name+"扔出冰川地雷");
}
/**
* 第二个技能
*/
public void secondSkill() {
System.out.println(this.name+"向前挥剑");
}
/**
* 第三个技能
*/
public void thirdSkill() {
System.out.println(this.name+"使用滞空无限连");
}
/**
* 第四个技能
*/
public void fourthSkill() {
System.out.println(this.name+"使用破刃");
}
}
4)Invoker代码实现
package org.xiji.command;
/**
* 游戏指令使用
*/
public class GameRoleInvoker {
Command command;
//构造
public GameRoleInvoker(Command command) {
this.command = command;
}
public GameRoleInvoker() {
}
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
//指定指令操作
public void firstSkill(){
command.firstSkill();
}
public void secondSkill(){
command.secondSkill();
}
public void thirdSkill(){
command.thirdSkill();
}
public void fourthSkill(){
command.fourthSkill();
}
}
5)Client代码实现
package org.xiji.command;
import java.util.ArrayList;
import java.util.List;
/**
* 命令模式
*/
public class CommandMain {
public static void main(String[] args) {
//创建角色
GameRole zhangsan = new GameRole("张三");
GameRole lisi = new GameRole("李四");
GameRole xiaojiu = new GameRole("小久");
GameRole xiji = new GameRole("惜己");
//封装角色指令
GameRoleCommand zhangsanCommand = new GameRoleCommand(zhangsan);
GameRoleCommand lisiCommand = new GameRoleCommand(lisi);
GameRoleCommand xiaojiuCommand = new GameRoleCommand(xiaojiu);
GameRoleCommand xijiCommand = new GameRoleCommand(xiji);
//创建指令队列
ArrayList<GameRoleCommand> gameRoleCommandMQ = new ArrayList<>();
gameRoleCommandMQ.add(zhangsanCommand);
gameRoleCommandMQ.add(lisiCommand);
gameRoleCommandMQ.add(xiaojiuCommand);
gameRoleCommandMQ.add(xijiCommand);
//执行角色指令队列
for (int i = 0; i < gameRoleCommandMQ.size(); i++) {
System.out.println("================================================================");
System.out.println("总共"+gameRoleCommandMQ.size()+"指令."+"现在执行"+(i+1)+"指令");
//使用指令,指令的执行模式
gameRoleCommandMQ.get(i).firstSkill();
gameRoleCommandMQ.get(i).secondSkill();
gameRoleCommandMQ.get(i).thirdSkill();
gameRoleCommandMQ.get(i).fourthSkill();
System.out.println("================================================================");
}
}
}