问题适用于类 QGraphicsView
qt库的。
但是,问题更为普遍。所以,如果我没有遗漏 qt 中的任何特殊机制,它可能可以在不了解 qt 的情况下进行讨论。
我正在子类化 QGraphicsView
添加一些我需要的功能。
例如。我有一个 ScalableView
, PannableView
和 LabeledView
添加独立功能。
我现在使用的子类化在以下意义上是线性的:
ScalableView
源自 QGraphics
看法。
PannableView
源自 ScalableView
看法。
LabeledView
源自 PannableView
查看。
由于这些功能是独立的,因此存在设计缺陷。
应用装饰器模式 来解决这个问题似乎适合我。
问题是,QGraphicsView
不是接口(interface),也不存在像QAbstractGraphicsView 这样的接口(interface)类。因此,对我来说,不清楚如何实现该模式。
另一种想法是使用模板。所以我可以从模板中导出每个 View T
.然后,我可以制作类似 ScalableView<PannableView<LabeledView>>>
的实例.
您认为有更好的解决方案吗?在这种情况下,我更喜欢一种实现装饰器模式的方法,因为我想避免使用许多会增加编译时间的模板类。
最佳答案
Qt 风格的一个简单解决方案是创建一个派生自 QGraphicsView
的类,并且仅具有控制其行为的标志(无论是可缩放、可平移、标记等)。这些行为的实现仍然会被拆分成方法,所以它是
不像看起来那么单一。
装饰器模式当然可以通过定义一个中间(垫片)接口(interface)轻松实现。 QGraphicsView
不需要实现该接口(interface) - 该接口(interface)仅供装饰器使用。
深度继承的问题在于无法精细地控制行为的交互。您拥有的唯一控制是事件处理的顺序。这可能恰好就足够了,但这让我有些担心。没有修饰的装饰器模式也存在这个问题。
关于c++ - QGraphicsView 和装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22379467/