20-命令模式
20-命令模式
1.命令模式
- 命令模式服务端。
// 事件对象,不同的事件对象对应不同的命令。
public class Event {
public static final Event GOT_DIAMOND = new Event();
public static final Event GOT_START = new Event();
}
// 请求,请求中包含事件对象。
public class Request {
private Event event;
public Event getEvent() {
return event;
}
}
public interface Command {
void execute();
}
// 获取钻石
public class GotDiamondCommand implements Command {
// 一个命令主要包含两部分:具体和命令和执行命令需要的数据。
// 执行命令需要的数据。
private final String data;
public GotDiamondCommand(String data) {
this.data = data;
}
@Override
public void execute() {
System.out.println("GotDiamondCommand execute." + this.data);
}
}
public class GotStartCommand implements Command {
private final String data;
public GotStartCommand(String data) {
this.data = data;
}
@Override
public void execute() {
System.out.println("GotStartCommand execute." + this.data);
}
}
- 命令模式客户端。
public class GameApplication {
private static final int MAX_HANDLER_REQ_COUNT_LOOP = 100;
private Queue<Command> queue = new LinkedList<>();
public void mainLoop() {
while (true) {
List<Request> requests = new ArrayList<>();
Command command = null;
// 省略从epoll或select中获取请求并封装为Request的过程。
for (Request request : requests) {
Event event = request.getEvent();
if (event.equals(Event.GOT_DIAMOND)) {
// 将命令封装为对象,将命令的发送和执行解耦。
command = new GotDiamondCommand("Got Diamond Command.");
} else if (event.equals(Event.GOT_START)) {
command = new GotStartCommand("Got Start Command.");
}
queue.add(command);
}
int handlerCount = 0;
while (handlerCount < MAX_HANDLER_REQ_COUNT_LOOP) {
if (queue.isEmpty()) {
Command c = queue.poll();
c.execute();
handlerCount++;
}
}
}
}
}
2.命令模式总结
-
<<设计模式:可复用面向对象软件的基础>>中命令模式的定义:命令模式将请求(也称为命令)封装为对象,这样,请求就可以作为参数来传递,并且能够支持请求的排队执行、记录日志、撤销等功能。
-
命令模式理解难度大,使用频率低,只有在特定场合使用;命令模式通过将命令封装为对象,解耦命令的发送和执行,进而方便对命令进行执行复杂的操作,如异步、延迟、排队执行命令、撤销重做命令、存储命令、记录命令的执行日志。
-
命令模式和策略模式的区别。命令模式和策略模式的代码实现比较相近,但是应用场景是不同的。在策略模式中,不同的策略具有相同的目的、不同的实现,互相之间可以替换;而在命令模式中,不同的命令具有不同的目的,对应不同的处理逻辑,并且相互之间不可替换。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗