命令模式详解:如何在手游后端架构中实现请求封装和操作管理

2024-12-31 09:39 更新

Hello,大家好,我是 V 哥

命令模式(Command Pattern)

命令模式是一种行为设计模式,它将一个请求封装为一个对象,从而允许用户使用不同的请求、队列或日志请求来参数化其他对象。命令模式也支持可撤销的操作。

在手游后端架构中的应用

  1. 封装玩家操作请求
    命令模式可以将玩家的操作请求(如移动、攻击、技能释放等)封装成对象,这些对象可以被存储在队列中,以便按顺序处理。

  1. 分离发送者和接收者
    通过命令模式,可以将发起操作的对象(发送者)和执行操作的对象(接收者)分离,使得系统更加模块化,易于扩展和维护。

  1. 实现操作的撤销和重做
    在游戏中,玩家可能会犯错或需要撤销之前的行动。命令模式可以轻松实现操作的撤销和重做功能。

  1. 异步执行操作
    命令模式可以将操作封装为对象,这些对象可以异步执行,不会阻塞主线程,提高游戏的响应性和性能。

  1. 广播玩家行为
    在游戏中,一个玩家的行为可能会影响其他玩家或游戏环境。命令模式可以将这些行为封装为命令对象,并通过事件系统广播给所有受影响的实体。

  1. 管理协同操作
    在多人游戏中,命令模式可以管理玩家之间的协同操作,确保操作的一致性和顺序性。

  1. 管理资源分配和回收
    游戏中的资源(如金币、道具等)的分配和回收可以通过命令模式来管理,确保资源操作的原子性和一致性。

  1. 封装网络请求和响应
    在网络游戏中,命令模式可以用于封装网络请求和响应,简化网络通信逻辑。

命令模式与其他设计模式的结合

命令模式通常与其他设计模式结合使用,如策略模式、观察者模式、状态模式等,以构建一个灵活、可扩展和易于维护的系统。

案例演示

创建一个完整的手游后端服务端示例涉及到许多组件,包括网络通信、数据库交互、业务逻辑处理等。在这里,我将提供一个非常简化的示例,它模拟了一个基本的游戏后端服务,包括玩家注册、登录和获取玩家信息的功能。这个示例将使用Java的Socket编程来处理客户端请求。

注意:这个示例仅用于教学目的,实际的手游后端会更加复杂,需要考虑安全性、并发性、数据库存储、错误处理等多个方面。

Player类

  1. public class Player {
  2. private String id;
  3. private String username;
  4. private String password;
  5. public Player(String id, String username, String password) {
  6. this.id = id;
  7. this.username = username;
  8. this.password = password;
  9. }
  10. // Getters and setters
  11. public String getId() {
  12. return id;
  13. }
  14. public String getUsername() {
  15. return username;
  16. }
  17. public String getPassword() {
  18. return password;
  19. }
  20. }

PlayerService类

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. public class PlayerService {
  4. private Map<String, Player> players = new HashMap<>();
  5. public synchronized String registerPlayer(String username, String password) {
  6. String playerId = Integer.toString(players.size() + 1);
  7. players.put(playerId, new Player(playerId, username, password));
  8. return playerId;
  9. }
  10. public synchronized Player login(String username, String password) {
  11. for (Player player : players.values()) {
  12. if (player.getUsername().equals(username) && player.getPassword().equals(password)) {
  13. return player;
  14. }
  15. }
  16. return null;
  17. }
  18. public synchronized Player getPlayer(String playerId) {
  19. return players.get(playerId);
  20. }
  21. }

GameServer类

  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.Scanner;
  4. public class GameServer {
  5. private ServerSocket serverSocket;
  6. private final int PORT = 12345;
  7. private PlayerService playerService = new PlayerService();
  8. public void startServer() {
  9. try {
  10. serverSocket = new ServerSocket(PORT);
  11. System.out.println("Game server is running on port " + PORT);
  12. while (true) {
  13. Socket socket = serverSocket.accept();
  14. new Handler(socket).start();
  15. }
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. private class Handler extends Thread {
  21. private Socket socket;
  22. private BufferedReader in;
  23. private PrintWriter out;
  24. public Handler(Socket socket) {
  25. this.socket = socket;
  26. try {
  27. in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  28. out = new PrintWriter(socket.getOutputStream(), true);
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. public void run() {
  34. try {
  35. String inputLine;
  36. while ((inputLine = in.readLine()) != null) {
  37. System.out.println("Received: " + inputLine);
  38. if ("REGISTER".equals(inputLine)) {
  39. String playerId = playerService.registerPlayer("username", "password");
  40. out.println("REGISTERED " + playerId);
  41. } else if ("LOGIN".equals(inputLine)) {
  42. Player player = playerService.login("username", "password");
  43. if (player != null) {
  44. out.println("LOGIN_SUCCESS " + player.getId());
  45. } else {
  46. out.println("LOGIN_FAILURE");
  47. }
  48. } else if ("GET_PLAYER".equals(inputLine)) {
  49. String[] parts = inputLine.split(" ", 2);
  50. if (parts.length == 2) {
  51. Player player = playerService.getPlayer(parts[1]);
  52. if (player != null) {
  53. out.println("PLAYER " + player.getId() + " " + player.getUsername());
  54. } else {
  55. out.println("PLAYER_NOT_FOUND");
  56. }
  57. }
  58. }
  59. }
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. } finally {
  63. try {
  64. socket.close();
  65. } catch (IOException e) {
  66. e.printStackTrace();
  67. }
  68. }
  69. }
  70. }
  71. public static void main(String[] args) {
  72. GameServer server = new GameServer();
  73. server.startServer();
  74. }
  75. }

GameClient类

  1. import java.io.*;
  2. import java.net.Socket;
  3. public class GameClient {
  4. private Socket socket;
  5. private PrintWriter out;
  6. private BufferedReader in;
  7. public GameClient(String serverAddress, int port) {
  8. try {
  9. socket = new Socket(serverAddress, port);
  10. out = new PrintWriter(socket.getOutputStream(), true);
  11. in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. public void sendCommand(String command) {
  17. out.println(command);
  18. }
  19. public String readResponse() {
  20. try {
  21. return in.readLine();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. return null;
  25. }
  26. }
  27. public void close() {
  28. try {
  29. socket.close();
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. public static void main(String[] args) {
  35. GameClient client = new GameClient("localhost", 12345);
  36. // 注册玩家
  37. client.sendCommand("REGISTER");
  38. String registerResponse = client.readResponse();
  39. System.out.println("Register response: " + registerResponse);
  40. // 登录玩家
  41. client.sendCommand("LOGIN");
  42. String loginResponse = client.readResponse();
  43. System.out.println("Login response: " + loginResponse);
  44. // 获取玩家信息
  45. String[] loginParts = loginResponse.split(" ", 2);
  46. if (loginParts.length == 2 && "LOGIN_SUCCESS".equals(loginParts[0])) {
  47. client.sendCommand("GET_PLAYER " + loginParts[1]);
  48. String playerResponse = client.readResponse();
  49. System.out.println("Player info response: " + playerResponse);
  50. }
  51. // 关闭连接
  52. client.close();
  53. }
  54. }

以上是本文的全部内容笔记,感谢老铁们的支持和鼓励,不当之处还请不吝赐教,欢迎关注威哥爱编程,努力的人相信总会有回报。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号