gpt4 book ai didi

c++ - 如何设计具有不同类型的通知和观察者的观察者模式?

转载 作者:行者123 更新时间:2023-12-02 09:55:56 26 4
gpt4 key购买 nike

场景:假设我有一个基类SketchbookEventObserver和派生类MouseClickObserverTouchObserverTextChangedObserver

所有这些SketchbookEventObserver都必须向网络请求有关发生的事件的数据:
MouseClickObserver-鼠标单击的坐标。
TouchObserver-触摸的坐标和持续时间。
TextChangedObserver-具有文本框标识符的新旧文本。

所有这些观察者都注册在UIEventRegistry类上。事件发生时,它将在每个观察者上调用OnEvent,并作为参数传递:

  • 事件的类型-鼠标单击/触摸/文本已更改。这由一个ID表示。
  • 有关事件的数据-如上所述。 每种类型的事件将具有不同类型的数据

  • 但是,我无法在每个派生类中使用不同的输入参数覆盖 OnEvent。如果我有通用和多态的输入参数,用 EventData函数说 GetData(),我仍然需要在 GetData()的派生类中覆盖 EventData,这将具有不同的返回值。这也是不可能的。

    另一个选择是在这些观察者之间没有任何继承,并将它们视为独立的实体。 EventRegistry将具有每种类型的观察者的数组/列表,在其中已知其类型,然后为鼠标单击事件调用 mMouseClickObservers[i].OnEvent(),为触摸事件调用 mTouchObservers[i].OnEvent(),依此类推。

    但这意味着 EventRegistry将需要具有有关具体类的知识,如果 EventRegistry是不同库/包的一部分,则需要公开公开这些具体类。

    有没有更好的方法来设计这个?

    最佳答案

    一种方法是您可以从EventData类派生MouseClickEventData,TouchEventData,TextChanged类。并转换您的EventData,以便为每个数据提供特定的类。

    OnEvent(EventData *data) {
    if (data->type == MOUSE_CLICK) {
    MouseClickEventData *mData = dynamic_cast<MouseClickEventData*>(data);
    // use mData->getCoordinates();
    }
    if (data->type == TEXT_CHANGED) {
    TextChangedEventData *tData = dynamic_cast<TextChangedEventData*>(data);
    // use tData->getNewText();
    }
    ....
    }

    关于c++ - 如何设计具有不同类型的通知和观察者的观察者模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60149502/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com