使用Publish/Subscribe 设计模式达到对象间数据同步(二)

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

在注册处理期间,subscriber被分配一个独特的标记,用来在event channel中标识subscriber。event channel也使用这个标记索引那些subscriber。 虽然样品应用作为标记目标的杂乱脉冲干扰电码使用,我推荐在你的自己的程序里使用另一个方法产生一个独特的标识符 ( 例如产生一GUID)。

使用目录菜单建立3到4个frmList窗口实例。使用新的目录菜单选项创作frmList 的3 或者4 个实例,然后在其中一个窗口中选择一个条目,双击这个条目进入可编辑模式,键入一个新的名字。窗体建立一个描述数据更新的事件并通过event channel发送。

Private Sub lvwList_AfterLabelEdit(ByVal sender As _ Object,

ByVal e As _ System.Windows.Forms.LabelEditEventArgs) _

Handles lvwList.AfterLabelEdit

Dim objEvent As clsDataEvent

If e.Label <> "" Then

objEvent = New clsDataEvent()

With objEvent

.Name = "NameChanged"

.Value = e.Label

.ExtraData = lvwList.Items(e.Item).Tag

.Origin = Me

End With

MyBase.EventChannel.PublishEvent(objEvent)

End If

End Sub

发送事件的窗体证实它是事件的创始人;并将clsDataEvent类的Origin属性设置为它自己。这样可以阻挡其他多余的事件,以确保发送者接收到的事件都是已经发布过的。最后,事件的发布者注意到了数据的改变。

所有的subscribers将收到事件。在EventApp 中,每个frmList 的实例将收到事件并且改变每个ListView中的发生变化的项目:

Public Overrides Sub EventRaise( _ ByVal NewEvent As _

EventApp.clsEvent)

Dim objListItem As ListViewItem

Select Case NewEvent.Name

Case "NameChanged"

For Each objListItem In lvwList.Items

If objListItem.Tag = NewEvent.ExtraData Then

objListItem.Text = NewEvent.Value

End If

Next

Case Else

'Handle other events

End Select

End Sub

这种事件系统类型将给你带来很大的灵活性。你可以使在应用程序中的任何一个

对象发布事件,只有那些对此感兴趣的对象的到更新的信息。也可以改变Event

Channel类的实现方式, 如可以通过使用Web service或者消息系统(如MS

Message Queue 或者 IBM MQ 系列),通过 HTTP协发送事件。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有