微信机器人Java后端的低耦合设计:基于接口抽象的多协议适配方案
·
微信机器人Java后端的低耦合设计:基于接口抽象的多协议适配方案
微信机器人常需同时支持Web、iPad、Mac、Windows等多个非官方协议,各协议在登录方式、消息格式、心跳机制上差异显著。若直接硬编码协议逻辑,将导致代码高度耦合、难以维护。本文基于wlkankan.cn.robot包,通过接口抽象与策略模式,实现协议无关的机器人核心逻辑。
统一机器人行为接口
package wlkankan.cn.robot.core;
import java.util.concurrent.CompletableFuture;
public interface WeChatRobot {
CompletableFuture<Boolean> login();
CompletableFuture<Void> sendMessage(String toUser, String content);
void registerMessageHandler(MessageHandler handler);
void startHeartbeat();
void logout();
}
package wlkankan.cn.robot.core;
@FunctionalInterface
public interface MessageHandler {
void onMessage(IncomingMessage msg);
}
package wlkankan.cn.robot.core;
public class IncomingMessage {
private String fromUser;
private String content;
private long timestamp;
private MessageType type;
public enum MessageType { TEXT, IMAGE, VOICE }
// getters
public String getFromUser() { return fromUser; }
public String getContent() { return content; }
public long getTimestamp() { return timestamp; }
public MessageType getType() { return type; }
}

iPad协议实现
package wlkankan.cn.robot.protocol.ipad;
import wlkankan.cn.robot.core.WeChatRobot;
import wlkankan.cn.robot.core.MessageHandler;
import wlkankan.cn.robot.core.IncomingMessage;
import java.util.concurrent.CompletableFuture;
public class IpadWeChatRobot implements WeChatRobot {
private MessageHandler handler;
private String deviceId = "e123456789012345";
@Override
public CompletableFuture<Boolean> login() {
return CompletableFuture.supplyAsync(() -> {
// 1. 获取UUID
// 2. 扫码登录
// 3. 初始化会话
System.out.println("Login via iPad protocol");
return true;
});
}
@Override
public CompletableFuture<Void> sendMessage(String toUser, String content) {
return CompletableFuture.runAsync(() -> {
// 构造iPad特有JSON格式
String json = String.format("""
{"to":"%s","content":"%s","type":1,"deviceid":"%s"}
""", toUser, content, deviceId);
// 发送HTTP请求
System.out.println("Send via iPad: " + json);
});
}
@Override
public void registerMessageHandler(MessageHandler handler) {
this.handler = handler;
// 启动WebSocket监听
startMessageListener();
}
private void startMessageListener() {
// 模拟收到消息
new Thread(() -> {
try {
Thread.sleep(2000);
IncomingMessage msg = new IncomingMessage();
msg.fromUser = "user123";
msg.content = "Hello from iPad";
msg.timestamp = System.currentTimeMillis();
msg.type = IncomingMessage.MessageType.TEXT;
if (handler != null) handler.onMessage(msg);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
}
@Override
public void startHeartbeat() {
// iPad协议需每30秒发送 synccheck
System.out.println("Start iPad heartbeat");
}
@Override
public void logout() {
System.out.println("Logout iPad session");
}
}
Mac协议实现
package wlkankan.cn.robot.protocol.mac;
import wlkankan.cn.robot.core.WeChatRobot;
import wlkankan.cn.robot.core.MessageHandler;
import wlkankan.cn.robot.core.IncomingMessage;
import java.util.concurrent.CompletableFuture;
public class MacWeChatRobot implements WeChatRobot {
@Override
public CompletableFuture<Boolean> login() {
return CompletableFuture.supplyAsync(() -> {
// Mac协议使用设备绑定+二维码
System.out.println("Login via Mac protocol");
return true;
});
}
@Override
public CompletableFuture<Void> sendMessage(String toUser, String content) {
return CompletableFuture.runAsync(() -> {
// Mac协议使用Protobuf二进制
byte[] payload = buildMacProto(toUser, content);
// 通过TCP发送
System.out.println("Send via Mac proto, length=" + payload.length);
});
}
private byte[] buildMacProto(String toUser, String content) {
// 模拟构建
return ("MAC:" + toUser + ":" + content).getBytes();
}
@Override
public void registerMessageHandler(MessageHandler handler) {
// Mac使用TCP长连接接收消息
new Thread(() -> {
try {
Thread.sleep(3000);
IncomingMessage msg = new IncomingMessage();
msg.fromUser = "user456";
msg.content = "Hello from Mac";
msg.timestamp = System.currentTimeMillis();
msg.type = IncomingMessage.MessageType.TEXT;
handler.onMessage(msg);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
}
@Override
public void startHeartbeat() {
System.out.println("Start Mac heartbeat (every 15s)");
}
@Override
public void logout() {
System.out.println("Logout Mac session");
}
}
协议工厂与运行时切换
package wlkankan.cn.robot.factory;
import wlkankan.cn.robot.core.WeChatRobot;
import wlkankan.cn.robot.protocol.ipad.IpadWeChatRobot;
import wlkankan.cn.robot.protocol.mac.MacWeChatRobot;
public class RobotFactory {
public static WeChatRobot createRobot(String protocol) {
return switch (protocol.toLowerCase()) {
case "ipad" -> new IpadWeChatRobot();
case "mac" -> new MacWeChatRobot();
default -> throw new IllegalArgumentException("Unsupported protocol: " + protocol);
};
}
}
业务层使用示例
package wlkankan.cn.robot.app;
import wlkankan.cn.robot.core.WeChatRobot;
import wlkankan.cn.robot.core.IncomingMessage;
import wlkankan.cn.robot.factory.RobotFactory;
public class RobotApplication {
public static void main(String[] args) {
String protocol = "ipad"; // 可从配置读取
WeChatRobot robot = RobotFactory.createRobot(protocol);
robot.registerMessageHandler(msg -> {
System.out.println("Received: " + msg.getContent() + " from " + msg.getFromUser());
// 自动回复
robot.sendMessage(msg.getFromUser(), "Auto-reply: got it!");
});
robot.login().thenRun(() -> {
robot.startHeartbeat();
robot.sendMessage("test_user", "Hello from " + protocol);
});
// 程序保持运行
try { Thread.sleep(10000); } catch (InterruptedException e) { }
robot.logout();
}
}
通过wlkankan.cn.robot模块定义的统一接口与多协议实现,业务逻辑完全不感知底层通信细节。新增协议(如Windows)仅需实现WeChatRobot接口,无需修改核心流程,显著提升系统可维护性与扩展能力。
更多推荐



所有评论(0)