如何在创建executor对象时动态切换TCP/UDP发送功能?
用策略模式解决你的问题
这完全是策略模式的典型应用场景——把变化的行为(UDP/TCP发送)抽离成独立的策略类,让依赖这个行为的executor类通过组合而非继承来使用策略,从而实现运行时动态切换。
步骤1:定义统一的发送策略接口
先创建一个抽象接口,规定所有发送类必须实现的方法:
interface Sender { void sendPayload(byte[] payload); }
步骤2:让现有发送类实现接口
修改udpSender和tcpSender,让它们实现上面的Sender接口:
class udpSender implements Sender { @Override public void sendPayload(byte[] payload) { // 你的UDP发送逻辑 } } class tcpSender implements Sender { @Override public void sendPayload(byte[] payload) { // 你的TCP发送逻辑 } }
步骤3:重构executor类
去掉executor对具体发送类的继承,改为通过构造函数注入Sender实例,所有需要发送的地方都调用这个注入的实例方法:
class executor { private final Sender sender; // 构造时传入具体的发送策略 public executor(Sender sender) { this.sender = sender; } // 示例配置方法,其他方法同理修改 public void configureRemoteDevice(byte[] configData) { // 原有业务逻辑保持不变 // ... // 发送时调用注入的sender方法 sender.sendPayload(configData); } }
步骤4:动态切换发送方式
现在创建executor对象时,只需传入不同的Sender实现即可:
// 创建使用UDP发送的executor executor udpExecutor = new executor(new udpSender()); udpExecutor.configureRemoteDevice(configBytes); // 创建使用TCP发送的executor executor tcpExecutor = new executor(new tcpSender()); tcpExecutor.configureRemoteDevice(configBytes);
优势
- 彻底摆脱了继承带来的紧耦合,
executor只依赖抽象的Sender接口,和具体发送实现解耦 - 新增其他发送方式(比如MQTT、HTTP)时,只需新增一个实现
Sender的类,完全不用修改executor的代码 - 运行时就能切换发送策略,不用再编译前修改基类
内容的提问来源于stack exchange,提问作者Denis Schaf
相关产品推荐
相关产品推荐

