命令模式原创
# 命令模式
# 说明
命令模式是一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。
命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。
概括:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。 核心:将发起请求的对象与执行请求的对象解耦。
# 场景
相信大家都玩过游戏,端游中在操作任务攻击时,需要用户按多个按钮进行操作。 比如 Q技能、W技能、E技能等。不同的命令对应着会执行不同的操作, 那么这种场景就很适合用命令模式组长不同的指令
# 命令接收者接口
/**
* @program: spring-test
* @description: 命令接收者接口 负责真正处理命令的工作
* @author: sizegang
* @create: 2022-05-03 14:35
**/
public interface Receiver {
/**
* 执行
*/
void action(String parms);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 接收接口实现
public class RealReceiver implements Receiver {
@Override
public void action(String parms) {
System.out.println("执行" + parms);
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 创建命令接口
public interface Command {
void execute();
}
1
2
3
2
3
# 创建命令抽象类
public abstract class BaseCommand implements Command {
// 任务接收者
protected Receiver receiver;
public BaseCommand(Receiver receiver) {
this.receiver = receiver;
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# Q技能命令
public class QSkillCommand extends BaseCommand{
public QSkillCommand(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.action("Q技能");
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# W技能命令
public class WSkillCommand extends BaseCommand{
public WSkillCommand(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.action("W技能");
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# E技能命令
public class ESkillCommand extends BaseCommand{
public ESkillCommand(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.action("E技能");
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 创建调用者
public class Invoker {
// 命令
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void invoke(){
command.execute();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 测试
public class Test {
public static void main(String[] args) {
RealReceiver realReceiver = new RealReceiver();
Invoker invokerQ = new Invoker(new QSkillCommand(realReceiver));
Invoker invokerW = new Invoker(new WSkillCommand(realReceiver));
Invoker invokerE = new Invoker(new ESkillCommand(realReceiver));
invokerQ.invoke();
invokerW.invoke();
invokerE.invoke();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 测试结果
执行Q技能
执行W技能
执行E技能
1
2
3
2
3
编辑 (opens new window)
上次更新: 2022/05/22, 17:59:26