设备间有多种通讯方式,但是接口基本类似,应该采用什么样的设计模式呢
目录
设备间有多种通讯方式,但是接口基本类似,应该采用什么样的设计模式呢?
在C++中,针对需要对接不同通信方式(如TCP、串口)但功能接口类似(如开始、停止)的场景,推荐采用策略模式(Strategy Pattern) 结合 **工厂模式(Factory Pattern)**来实现。以下是具体分析和实现步骤:
1 策略模式(Strategy Pattern)
核心思想 :将每种通信方式封装为独立的策略类,实现统一的接口,使得客户端可以动态切换具体实现,而无需修改调用逻辑。
步骤实现 :
- 定义抽象接口 :声明所有通信方式共有的方法(如
start()
、stop()
)。 - 实现具体策略 :为TCP、串口等通信方式创建具体类,继承并实现接口。
- 客户端通过接口调用 :客户端代码依赖抽象接口,而非具体实现,实现解耦。 // 抽象接口 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)
核心思想 :通过工厂类封装对象的创建逻辑,客户端无需关心具体类的实例化过程。
步骤实现 :
- 定义通信类型枚举 :标识支持的通信方式。
- 实现工厂类 :根据类型参数返回对应的策略对象。 enum class CommunicationType { TCP, SERIAL }; class CommunicationFactory { public: static std::unique_ptr create(CommunicationType type) { switch (type) { case CommunicationType::TCP: return std::make_unique(); case CommunicationType::SERIAL: return std::make_unique(); default: throw std::invalid_argument(“Unsupported communication type”); } } };
3 客户端代码
客户端通过工厂获取具体策略对象,并通过抽象接口操作通信逻辑。 int main() { // 根据配置或用户输入选择通信方式 auto comm = CommunicationFactory::create(CommunicationType::TCP); // 统一接口调用 comm->start(); comm->send(“Hello, World!”); auto response = comm->receive(); comm->stop(); return 0; }
优势
- 开闭原则 :新增通信方式时,只需添加新的策略类和更新工厂,无需修改现有代码。
- 解耦 :客户端代码与具体通信实现解耦,依赖抽象接口。
- 可维护性 :不同通信方式的逻辑隔离,易于单独测试和维护。
扩展性优化
- 注册式工厂 :通过动态注册策略类的方式,避免工厂类硬编码具体类型,进一步提升扩展性。
- 依赖注入 :结合依赖注入框架,动态注入具体策略对象。
最终方案 :策略模式 + 工厂模式 ,既实现了不同通信方式的无缝切换,又保证了代码的简洁性和可扩展性。