代码之家  ›  专栏  ›  技术社区  ›  Bas Smit

事件驱动通信设计问题

  •  0
  • Bas Smit  · 技术社区  · 16 年前

    我在设计问题上有点纠结。我用c_制作了一个非常简单的gui系统。代码是可重用的,所以我在这里寻找最灵活的解决方案。我提出的解决方案似乎都有缺点。

    为了简单起见,我们假设有三个类:控制器、按钮和客户机代码。客户端代码是使用gui系统的代码。它创建控制器并对其调用update()。控制器创建一组按钮实例并对其调用update()。按钮会自动绘制并检查是否有鼠标单击。

    现在的问题是我如何得到一个按钮被点击到客户端代码的事实?

    选项1:将getButton(字符串名称)添加到控制器类。然后,客户机代码可以订阅button类中定义的事件=>getbutton(“but”).mouseupevent+=mouseuphandler;这样做的缺点是,它公开了button.update(),而button.update()只能由控制器使用。

    选项2:让控制器订阅所有按钮,客户端代码订阅控制器。这里的缺点是客户端代码中有更多的解析代码,因为现在所有的事件都通过控制器进行漏斗式处理,所以客户端必须检查哪个按钮发送了每个事件。我更喜欢在初始化阶段设置事件流,就像在选项1中一样。

    选项3:为每个事件向控制器添加subscribe/unsubscribe方法(subscribebemouseup(string buttonname,guidelegate del)等)缺点是控制器api增长很快。

    所以现在我倾向于选项1,但是getButton返回一个接口(可能是iclientButton),它只声明事件,从而对客户端隐藏update(),但是我不确定接口是否应该这样使用。

    任何洞察都是值得赞赏的。 制动辅助系统

    4 回复  |  直到 16 年前
        1
  •  0
  •   cyborg    16 年前

    大概这是个问题,因为 Update() 是公开的吗?

    假设您已将按钮和控制器组织到使用 internal 保护适合你的需要?

        2
  •  0
  •   Muad'Dib    16 年前

    接口可以这样使用,inotifypropertychanged是一个与1项(事件)的交互。

    使用呢 RoutedEvents ?

        3
  •  0
  •   patros    16 年前

    还有第四个,也许更受欢迎的选择。

    将调度程序作为中心位置进行注册/注销。所有事件接收器都向调度程序注册回调。所有事件生成器都将其事件发送给调度程序。

    它使api保持干净,并有助于解开对象引用。

        4
  •  0
  •   Matt Davis    16 年前

    在控制器中,添加两个事件- ButtonCreated ButtonDestroyed .

    public event EventHandler<ClientButtonEventArgs> ButtonCreated;
    public event EventHandler<ClientButtonEventArgs> ButtonDestroyed;
    

    这个 ClientButtonEventArgs 仅仅是一个 EventArgs 包裹你的 IClientButton 接口。

    让您的客户机代码订阅这两个事件。当控制器创建一个新按钮时,让它启动 钮扣 事件。然后,客户端代码可以在接收到事件通知时订阅必要的按钮事件。类似地,控制器将启动 扣子松开 事件,允许客户端代码取消订阅按钮的事件。

    这样,整个序列都是事件驱动的。客户代码 反应 对于一个按钮的创建和销毁,它似乎是你所追求的。