如何替换抽象类? 组合而不是继承-具体问题

问题描述

当我想为抽象类编写单元测试(测试常用方法)时,我的问题开始了,而不是我发现更喜欢组合而不是继承(我可以对正在更改“连接”的部分使用模拟")

现在我很难想出一些正确的设计,所以有人可以帮我吗?

我的全部代码都可以在 here 找到,但为了简单起见,我将在这里简短地描述它。我有 PlcData 类,它表示我需要从 PLC 读取的变量的当前状态。 PlcData 代表 观察者模式 中的主题,我使用不同的类订阅它(我还需要知道确切的属性已更改,这就是 PlcData 实现“源”的原因我需要观察的每个属性的接口,我还需要在属性更改时获取所有数据,因为基于我在数据库中搜索的其他一些属性 - 这就是为什么我在任何属性更改时发送整个 PlcData)。我想让 PlcData 的观察者独立于连接(PlcData 如何从 PLC 读取/写入变量)。

这是我带有抽象 PlcData 的原始设计:

Current design

我想实现这样的事情(很多程序员证实我这是正确的方法),其中 PlcData 是具体类(我将来也可以使用它的接口)并且连接是作为 PlcData 的属性:

New design

我的问题是我不知道如何正确实现这一点。 “Connection”的每个具体类将使用一些库,并且这里会有很多细节,但它应该处理订阅、读取、写入那些“重要”变量(serialNumber、measuredCurve ... - 在实际代码中我有更多其中,但它们是完全给定的)。但是我希望这对于 PlcData“user”是不可见的,所以他只需调用一些工厂方法 PlcDataProvider.getPlcData() 并且他将获得具有初始化连接的 PlcData 实例,他只需订阅他需要的变量(或写入这些变量,PlcData 类将处理如何通过“连接”接口将它们发送到 PLC。

我最大的问题

  1. 我不知道如何正确地使 Connection 更新 PlcData 以及如何通过它写入真实的 PLC 变量(我真的在这里迷路了,我最终得到了三个每个属性的方法(writeSerialNumber、readSerialNumber、subscribeToSerialNumber 和 Connection 需要跟踪 PlcData

  2. 如何使用一些工厂正确创建PlcData

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)