抽象类适合在网络协议解析器中定义握手和断开的统一骨架,共性逻辑(超时控制、日志记录、状态校验)在父类实现,协议特有行为(报文格式、认证方式等)由子类实现;通过final方法封装流程、抽象方法强制实现、依赖注入解耦底层、工厂模式支持扩展。

抽象类适合在网络协议解析器中定义握手和断开的统一骨架,把共性逻辑(如超时控制、日志记录、状态校验)在父类中实现,把协议特有行为(如握手报文格式、认证方式、断开确认机制)留给子类实现。
定义抽象协议处理器基类
创建一个抽象类(如 ProtocolHandler),封装连接生命周期的关键阶段:初始化、握手、数据交互、断开。其中握手和断开声明为抽象方法,强制子类实现细节;同时提供默认的流程控制逻辑:
- 用 final 方法(如 connect())封装完整握手流程:先调用 doPreHandshake()(可选预处理),再调用抽象的 performHandshake(),最后执行 onHandshakeSuccess()
- 类似地,disconnect() 是 final 方法,按顺序调用 prepareForDisconnect() → sendByePacket()(抽象)→ closeUnderlyingChannel()
- 所有关键步骤支持异常统一捕获与重抛(如 HandshakeFailedException),避免子类遗漏错误处理
分离协议无关的基础设施
抽象类中不直接操作 Socket 或 Netty Channel,而是依赖注入或模板方法暴露的钩子来获取底层连接对象。例如:
- 定义 protected abstract Channel getChannel() 或 protected abstract InputStream getInputStream()
- 超时控制统一由父类管理:private final int handshakeTimeoutMs = 5000;,在 performHandshake() 调用前启动计时,在子类实现中通过轮询或回调配合中断检测
- 状态字段(如 volatile boolean isConnected)由父类维护,子类只通过受保护的 markConnected() / markDisconnected() 修改
子类只需专注协议语义
具体协议实现(如 MqttProtocolHandler、ModbusTcpHandler)继承抽象类后,仅需填充核心协议逻辑:
立即学习“Java免费学习笔记(深入)”;
- performHandshake():构造 CONNECT 报文、写入流、读取 CONNACK 并校验返回码
- sendByePacket():发送 DISCONNECT 报文或 MODBUS 关闭帧,并等待对端 ACK(如有)
- 可选择重写 onHandshakeSuccess() 做协议特定初始化(如订阅默认主题、设置心跳间隔)
- 无需重复写超时判断、连接状态更新、异常包装等样板代码
配合工厂与策略提升扩展性
抽象类本身不负责协议识别,但可与工厂模式协作:
- 定义 ProtocolType 枚举或接口标识协议类型
- 由 ProtocolHandlerFactory 根据协议头字节或配置返回对应子类实例
- 上层业务代码只依赖 ProtocolHandler 接口/抽象类,完全解耦具体协议实现
- 新增协议(如自定义私有协议)只需新增子类 + 注册到工厂,不修改现有握手/断开流程


















