【发布时间】:2020-02-10 11:32:10
【问题描述】:
场景:假设我有一个基类SketchbookEventObserver 和派生类MouseClickObserver、TouchObserver 和TextChangedObserver。
所有这些SketchbookEventObservers 都必须使用所发生事件的数据发出网络请求:
MouseClickObserver - 鼠标点击的坐标。
TouchObserver - 触摸的坐标和持续时间。
TextChangedObserver - 带有文本框标识符的旧文本和新文本。
所有这些观察者都在UIEventRegistry 类上注册。当事件发生时,它会在每个观察者上调用OnEvent,并作为参数传递:
- 事件类型 - 鼠标单击/触摸/文本已更改。这由 ID 表示。
- 有关事件的数据 - 如上所述。 每种类型的事件都会有不同类型的数据。
但是,我不能在每个派生类中使用不同的输入参数覆盖OnEvent。如果我有输入参数泛型和多态,比如带有GetData() 函数的EventData,我仍然需要在EventData 的派生类中覆盖GetData(),这将具有不同的返回值。这也是不可能的。
另一种选择是在这些观察者之间没有任何继承,并将它们视为单独的实体。 EventRegistry 将拥有每个类型的观察者的数组/列表,它们的类型是已知的,然后调用 mMouseClickObservers[i].OnEvent() 进行鼠标点击事件,mTouchObservers[i].OnEvent() 进行触摸事件,等等。
但这意味着EventRegistry 需要了解具体类,如果EventRegistry 是不同库/包的一部分,则需要公开这些类。
有更好的设计方法吗?
【问题讨论】:
标签: c++ oop design-patterns