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

问题描述 投票:0回答:1

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

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

我的整个代码可以在here找到,但为了简单起见,我将尝试在这里简短地描述它。我有类

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

这是我的原创设计与抽象

PlcData

我想实现这样的目标(很多程序员向我证实这是正确的方法),其中

PlcData
是具体类(我将来也可以使用它的接口)并且连接是
 的属性PlcData

我的问题是我不知道如何正确实现这一点。 “Connection”的每个具体类将使用一些库,并且这里有很多细节,但它应该处理订阅、读取、写入那些“重要”变量(serialNumber、measuredCurve ... - 在实际代码中我有更多其中,但它们是准确给出的)。但我希望这对于

PlcData
“用户”来说是不可见的,所以他只需调用一些工厂方法
PlcDataProvider.getPlcData()
,他将获得具有初始化连接的 PlcData 实例,并且他只需订阅他需要的变量(或写入那些变量和
PlcData
类将处理如何通过“连接”接口将它们发送到 PLC。

我最大的问题

  1. 我不知道如何正确地使

    Connection
    更新
    PlcData
    以及如何在其上写入真正的PLC变量(我真的在这里迷失了方向,我最终为每个属性提供了三种方法(writeSerialNumber、readSerialNumber) 、 subscribeToSerialNumber 和
    Connection
    需要跟踪
    PlcData
    )

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

java oop design-patterns strategy-pattern
1个回答
0
投票

您的新设计将需要

PlcData
Connection
之间所谓的双边关联,这意味着两者应该相互引用。这很麻烦。

而是使用“用单向替换双向关联”重构。这样只有

PlcData
才会知道
Connection
,反之亦然。

PlcData
负责更新自己的字段。
Connection
不应该知道这一点(它应该只......连接)。这意味着
Connection#update*
方法属于
PlcData

PS:这闻起来也更像

Bridge
图案。
Strategy
执行算法,我不确定这里的情况是否如此。

© www.soinside.com 2019 - 2024. All rights reserved.