【发布时间】:2017-08-21 19:52:10
【问题描述】:
我有三种类型的数据链路:RS485、I2C 和蓝牙。每个数据链路都具有连接、读取和写入数据等功能。在 PC 软件上,我必须实现应用程序/协议层才能与设备一起使用。 在我之前关于 OOP 的问题中,我得到了使用桥接模式或工厂方法的答案,但我认为这可以做得更好。 我会问是否更好地使用模板来完成这项任务。这是我想如何使用它的简单示例:
// Low level datalink class
class RS485
{
public:
void send(const char *data) {
// datalink function to send data using RS485
printf("RS485: %s \n", data);
}
};
class I2C
{
public:
void send(const char *data) {
// datalink function to send data using I2C
printf("I2C: %s \n", data);
}
};
class BT
{
public:
void send(const char *data) {
// datalink function to send data using Bluetooth
printf("BT %s \n", data);
}
};
// Protocol class
template<typename Comm>
class MODBUS
{
public:
MODBUS(Comm *c) { _c = c; }
void send(const char *data) {
printf("MODBUS\n");
_c->send(data);
}
private:
Comm *_c;
};
// Protocol class
template<typename Comm>
class TCP
{
public:
TCP(Comm *c) { _c = c; }
void send(const char *data) {
printf("TCP\n");
_c->send(data);
}
private:
Comm *_c;
};
int main() {
// Modbus over I2C
I2C *i2c = new I2C();
MODBUS<I2C> *mb_i2c = new MODBUS<I2C>(i2c);
mb_i2c->send("Data ...");
// Modbus over RS485
RS485 *rs = new RS485();
MODBUS<RS485> *mb_rs = new MODBUS<RS485>(rs);
mb_rs->send("Data ...");
// Tcp over Modbus over RS485
TCP< MODBUS<RS485> > *tcp_modbus_rs = new TCP< MODBUS<RS485> >(mb_rs);
tcp_modbus_rs->send("Data ...");
return 0;
}
【问题讨论】:
-
为什么你认为这比使用带有纯虚拟
send方法的基类更好? -
因为很难做出“开始” :) 检查我的代码中的最后一个示例“Tcp over Modbus over RS485”
-
[OT]:你有内存泄漏,不需要你的新的。
标签: c++ templates design-patterns generic-programming