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






4.60/5 (10投票s)
2004年1月6日
2分钟阅读

70586

238
在这里,你将了解到如何实现一种模式,该模式允许你在对象层次结构的不同级别上处理事件。
什么是Bubble事件?
有时你需要在类的层次结构的不同层上处理一个事件。以以下情况为例
你需要实现一个系统,该系统将从串行连接接收数据,将其解析为几个命令,并相应地处理它们。该应用程序将必须向一个窗体报告其活动。该窗体必须呈现
- 几个连接的列表
- 每个连接发送和接收的字节数
- 每个连接执行的最后一个命令
可能的解决方法之一是
- 为低级串行通信创建一个基类 (
Connection
) - 创建一个将处理命令并将响应发送回调用者的类 (
Communicator
) - 创建一个将包含几个
Communicator
的类 (CommManager
)
你需要处理以下事件
OnData
当数据发送到或从串行端口接收时,会触发此事件。
OnCommand
当命令由
Communicator
处理时,会触发此事件。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
事件的级别。