微信机器人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接口,无需修改核心流程,显著提升系统可维护性与扩展能力。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐