设备间有多种通讯方式,但是接口基本类似,应该采用什么样的设计模式呢?

在C++中,针对需要对接不同通信方式(如TCP、串口)但功能接口类似(如开始、停止)的场景,推荐采用策略模式(Strategy Pattern) 结合 **工厂模式(Factory Pattern)**来实现。以下是具体分析和实现步骤:


1. 策略模式(Strategy Pattern)

核心思想:将每种通信方式封装为独立的策略类,实现统一的接口,使得客户端可以动态切换具体实现,而无需修改调用逻辑。

步骤实现
  1. 定义抽象接口 :声明所有通信方式共有的方法(如start()stop())。
  2. 实现具体策略:为TCP、串口等通信方式创建具体类,继承并实现接口。
  3. 客户端通过接口调用:客户端代码依赖抽象接口,而非具体实现,实现解耦。
cpp 复制代码
// 抽象接口
class CommunicationInterface {
public:
    virtual ~CommunicationInterface() = default;
    virtual void start() = 0;
    virtual void stop() = 0;
    virtual void send(const std::string& data) = 0;
    virtual std::string receive() = 0;
};

// TCP通信策略
class TcpCommunication : public CommunicationInterface {
public:
    void start() override { /* TCP启动逻辑 */ }
    void stop() override { /* TCP停止逻辑 */ }
    void send(const std::string& data) override { /* TCP发送数据 */ }
    std::string receive() override { /* TCP接收数据 */ return ""; }
};

// 串口通信策略
class SerialCommunication : public CommunicationInterface {
public:
    void start() override { /* 串口启动逻辑 */ }
    void stop() override { /* 串口停止逻辑 */ }
    void send(const std::string& data) override { /* 串口发送数据 */ }
    std::string receive() override { /* 串口接收数据 */ return ""; }
};

2. 工厂模式(Factory Pattern)

核心思想:通过工厂类封装对象的创建逻辑,客户端无需关心具体类的实例化过程。

步骤实现
  1. 定义通信类型枚举:标识支持的通信方式。
  2. 实现工厂类:根据类型参数返回对应的策略对象。
cpp 复制代码
enum class CommunicationType { TCP, SERIAL };

class CommunicationFactory {
public:
    static std::unique_ptr<CommunicationInterface> create(CommunicationType type) {
        switch (type) {
            case CommunicationType::TCP:
                return std::make_unique<TcpCommunication>();
            case CommunicationType::SERIAL:
                return std::make_unique<SerialCommunication>();
            default:
                throw std::invalid_argument("Unsupported communication type");
        }
    }
};

3. 客户端代码

客户端通过工厂获取具体策略对象,并通过抽象接口操作通信逻辑。

cpp 复制代码
int main() {
    // 根据配置或用户输入选择通信方式
    auto comm = CommunicationFactory::create(CommunicationType::TCP);

    // 统一接口调用
    comm->start();
    comm->send("Hello, World!");
    auto response = comm->receive();
    comm->stop();

    return 0;
}

优势

  1. 开闭原则:新增通信方式时,只需添加新的策略类和更新工厂,无需修改现有代码。
  2. 解耦:客户端代码与具体通信实现解耦,依赖抽象接口。
  3. 可维护性:不同通信方式的逻辑隔离,易于单独测试和维护。

扩展性优化

  • 注册式工厂:通过动态注册策略类的方式,避免工厂类硬编码具体类型,进一步提升扩展性。
  • 依赖注入:结合依赖注入框架,动态注入具体策略对象。

最终方案策略模式 + 工厂模式,既实现了不同通信方式的无缝切换,又保证了代码的简洁性和可扩展性。

相关推荐
烬羽1 天前
NestJS 依赖注入:Controller 里那个没有 new 的 service,到底从哪来的?
设计模式·typescript·nestjs
用户938515635071 天前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs
烬羽2 天前
从 nest new 到 Hello World:一个最小 NestJS 项目,讲透工厂 + 装饰器 + 模块化
设计模式·node.js·nestjs
艺艺生辉3 天前
从if-else到策略模式
后端·设计模式
小林ixn3 天前
单例模式:从弹窗管理到全局状态,一个模式搞定
前端·javascript·设计模式
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-17-装饰器模式(源码剖析篇)
java·spring·设计模式·装饰器模式·源码分析·io流
workflower3 天前
案例 :某交通厅基于AI技术的智能安全运营实践
网络·人工智能·安全·设计模式·机器人
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-16-装饰器模式(业务实战篇)
java·设计模式·装饰器模式·功能扩展·动态增强
workflower4 天前
例二:某汽车制造企业深度融合AI智能体,构建园区网络的智能运维体系
人工智能·机器学习·设计模式·机器人·云计算·汽车·制造
ly76894 天前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式