65.9K
CodeProject 正在变化。 阅读更多。
Home

在VB.NET Windows Forms中实现Bubble事件(责任链模式)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (10投票s)

2004年1月6日

2分钟阅读

viewsIcon

70586

downloadIcon

238

在这里,你将了解到如何实现一种模式,该模式允许你在对象层次结构的不同级别上处理事件。

什么是Bubble事件?

有时你需要在类的层次结构的不同层上处理一个事件。以以下情况为例

你需要实现一个系统,该系统将从串行连接接收数据,将其解析为几个命令,并相应地处理它们。该应用程序将必须向一个窗体报告其活动。该窗体必须呈现

  1. 几个连接的列表
  2. 每个连接发送和接收的字节数
  3. 每个连接执行的最后一个命令

可能的解决方法之一是

  1. 为低级串行通信创建一个基类 (Connection)
  2. 创建一个将处理命令并将响应发送回调用者的类 (Communicator)
  3. 创建一个将包含几个 Communicator 的类 (CommManager)

你需要处理以下事件

  1. OnData

    当数据发送到或从串行端口接收时,会触发此事件。

  2. OnCommand

    当命令由 Communicator 处理时,会触发此事件。

  3. OnError

    如果在数据传输中发生任何错误,则由 Connection 触发此事件。

OnData 事件在 Connection 类中定义。它在 Communicator 中被处理,以解析输入缓冲区,以便确定要运行哪个命令。它还必须传播到 CommManager 类,该类将依次通知其父窗体,某些数据已处理。

OnError 事件也在 Connection 类中定义。它将通知父类关于串行通信中的错误。

OnCommand 事件在 Communicator 类中定义。当命令被处理时,它被触发。它将通知窗体有关最后执行的命令的信息。

我将 BubbleEvent 定义为要通过包含或聚合其他对象的几个对象进行处理或传播的事件。以下实现遵循“责任链”模式。

实现

为了实现该方案,我们需要以下内容

这是事件处理程序需要实现的接口

Public Interface IBubbleEventHandler
    Property EventSuccessor() As IBubbleEventHandler
    Function HandleBubbleEvent(ByRef evt As BubbleEvent)
    Function ForwardBubbleEvent(ByRef evt As BubbleEvent)
End Interface

EventSuccessor 是一个属性,用于设置或返回链中的下一个处理程序。 HandleBubbleEvent 是一个方法,它要么处理,要么调用 ForwardBubbleEvent,后者将事件转发给链中的下一个处理程序。

' BubbleEvent

  ' This is the base class for BubbleEvents

  ' It provdes basic event properties:

  ' Name – event ID for reference purposes

  ' Parameters collection – event parameters

 
  Public MustInherit Class BubbleEvent
    Private _name As String
    Private _params As ArrayList
 
    Public ReadOnly Property Name() As String
      Get
        Return _name
      End Get
    End Property
 
    Public ReadOnly Property Parameters() As ArrayList
      Get
        Return _params
      End Get
    End Property
 
    Public Sub New(ByVal astrEvtName As String, _ 
         ByRef aobjEvtSource As IBubbleEventHandler, _ 
         ByVal ParamArray params() As Object)
      Dim p
 
      _name = astrEvtName
      _params = New ArrayList()
      _params.Add(aobjEvtSource)
 
      For Each p In params
        _params.Add(p)
      Next
    End Sub
  End Class

这就是我们将在示例应用程序中实现的内容。

示例

我们将根据抽象对象实现上述情况。有关详细信息,请参阅演示项目。

在示例中,我们有一个基类、一个从基类继承的子类以及一个子类集合。该集合将由窗体上的 ListView 控件表示。每当你在 ListView 中选择一个条目并更改所选项目的 Prop1 属性时,你将看到消息框显示你处理 Change 事件的级别。

© . All rights reserved.