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

对象|设计|数据|数据同步

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

应用程序经常需要更改和交换数据,必须传送这些更改后数据以达到对象的同步,尤其在多窗口用户界面应用程序中更要求这种数据的同步协调,在这一类应用程序中,潜在的数据更新信息一定要反映到所有被包含的子窗体中。

例如一个人员信息管理的应用程序。一次可以打开多个包含一个人名字的窗口,如果你在其中一个窗口中修改并报存了这个人的名字,你将期望对名字改变应立即显示在其它全部窗体内。可以通过使用Publish/Subscribe设计模式来完成这种功能。这种设计模式是Observer 模式(见图一)的一种变体。Observer 模式在Design Patterns, Elements of Reusable Object Oriented Software书中有很详细的描述,在Observer 模式中,一个对象(Observer观察者)被注册到另一对象(主体Subject),用于监听事件。观察者(Observer)暗中地反映(主体Subject)的变化。

图一

Publish/Subscribe模式(参见图二),在主体(Subject)和观察者(Observer)之间增加了一层间隔。 这个层移除了在观察者(Observer)和主体(Subject)之间的捆绑并且在这两之间建立一种松耦合的关系。 Event Channel 可以被描述成一个数据中心。

图二

Publisher (就是在观察者(Observer)模式中的主体(Subject)) 向这个Event Channel.发布事件。Event Channel 的责任就是向所有的Subscribers (就是在观察者(Observer)模式中的观察者(Observer))散布事件。一个应用程序可以包含一个或多个Event Channel,所以,要向每个感兴趣的Subscribers来散布不同的事件。此外,在观察者(Observer)模式中事件仅仅来自特殊的来源,在Publish/Subscribe模式中任何注意Event Channel的对象都可以发布事件。

这个构造移除了观察者(Observer) and主体(Subject)之间的依赖。结果是你可以为你的应用程序增加更多的通用设计,此外,通过要求在Publisher和Subscriber之间的没有直接的关系,它大大增加你的应用程序的可维护性。

使用Publish/Subscribe模式

通过一个简单的例子来学习Publish/Subscribe模式是如何实现的。EventApp. EventApp是一个拥有一个MDI窗体和很多子窗体的应用环境。(下载本文代码).

在你的程序中,你将需要创造一系列的基类来实现Publish/Subscribe模式。 在工程里的其他类都从这些基类派生而来(见图三)。 EventApp 应用程序有如下3 个基类:

图三

clsEventChannel ----------------------为构建event channels的一个抽象类。
clsEvent --------------------------为构建事件的类型使用的一个抽象类。 它暴露了4个属性:
Name: 事件的名字
Value: 事件的价值
ExtraData: 被关联那些事件的其它数据
Origin: 可选择的参考鉴定事件的 publisher
frmSubscriber – 用于创建窗口、接收事件的一个抽象Windows Form
为了使一应用工作,你需要建立从那些基类继承的几个具体的类。 在这个例子当中,这些类是:

clsDataEvents - 从clsEventChannel类继承的一个具体的类。 在应用程序中,将它作为event channel来使用,它被用来向那些潜在的数据模型散布更新的信息。
clsDataEvent - 从clsEvent类继承并且用来创建事件,呈现潜在数据的更新的一个具体的类。 ( 要创建一个继承窗体,你可以在解决方案资源管理器中选择" 添加(Add)-> 添加继承的窗体(Inherited Windows Form)" 的快捷菜单 。
frmList – 派生自frmSubscriber类的一个具体的类。它是MDI窗体的一个子窗体,用于显示数据列表。在这个例子中,这个窗体通过硬编码用一个Listview控件显示了10条数据。

EventApp 如何工作

当EventApp 被启动时, frmMain( MDI 父窗体) 创造一个数据event channel实例-----clsDataEvents:

Private Sub frmMain_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
mobjDataEventChannel = New clsDataEvents()
Me.IsMdiContainer = True
Me.Text = "Publish/Subscribe Event Sample"
Me.WindowState = FormWindowState.Maximized
End Sub

当MDI窗体被运行时,你可以在菜单中选择"File->New List"来创建一个frmList类的实例。
Private Sub MenuItem2_Click(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles MenuItem2.Click
Dim objNewForm As frmList

objNewForm = New frmList()
mobjDataEventChannel.AttachSubscriber(objNewForm)
objNewForm.MdiParent = Me
objNewForm.Show()
End Sub
当创建了子窗体以后,它将被注册到event channel,在注册过程期间,event channel将要初始化subscriber。
Public Overridable Sub Initialize(ByVal Token As _
String, ByVal EventChannel As clsEventChannel)
mstrToken = Token
mobjEventChannel = EventChannel
End Sub

时间: 2024-08-31 14:09:22

使用Publish/Subscribe 设计模式达到对象间数据同步的相关文章

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

对象|设计|数据|数据同步 在注册处理期间,subscriber被分配一个独特的标记,用来在event channel中标识subscriber.event channel也使用这个标记索引那些subscriber. 虽然样品应用作为标记目标的杂乱脉冲干扰电码使用,我推荐在你的自己的程序里使用另一个方法产生一个独特的标识符 ( 例如产生一GUID). 使用目录菜单建立3到4个frmList窗口实例.使用新的目录菜单选项创作frmList 的3 或者4 个实例,然后在其中一个窗口中选择一个条目,双

《Ember.js实战》——2.6 Ember.js实现各层间数据同步

2.6 Ember.js实现各层间数据同步 本章前面我们看到了一个数据同步模型,其可以确保数据始终在客户端和服务器端之间保持同步(见图2-2).在这个模型中,应用程序8个步骤中就有6个需要显式跟踪并关注应用程序内部状态.反观Ember.js框架如何使用绑定.控制器以及清晰的模型层来尽可能多地自动化样板代码,孰优孰劣就很清楚了.图2-8展示了一个改进后的概念模型. Ember.js方式的步骤减少了,这是因为我们把更多的样板代码留给了Ember.js框架,而你仍完全掌控着应用的数据流.与前面模型相比

求一反射比较对象间数据差异。

问题描述 希望:publicclassA{[SampleAttribute(Label="字段1")]publicstringFieldA{get;set;}publicclassB{get;set;}}publicclassB{[SampleAttribute(Label="字段2")]publicstringFieldB{get;set;}publicclassC{get;set;}}publicclassC{[SampleAttribute(Label=&qu

hibernate多服务器间数据同步

需求功能介绍: 为性能考虑,单一服务器改成集群(每太服务器数据允许在一定时间内保持相步),给出的修改时间短,不过代码持久层比较统一(hibernate 感谢天还好是她! ).网络连接不稳定(铁路内网!). 完成后效果: 当网络连接成功时,多数据库的同步. 当网络连接失败时,本地应用程序运用hibernate拦截器拦截正操作对象并记录下操作动作,序列化到本地时局库 z_jcyy_tb 表中.表数据属性为:id,inputdate(记录时间),object(序列对象),action(操作动作).并安

用drbd实现node间数据同步复制及脑裂修复

Distributed Replicated Block Device(DRBD)是一个用软件实现的.无共享的.服务器之间镜像块设备内容的存储复制解决方案. 数据镜像:实时.透明.同步(所有服务器都成功后返回).异步(本地服务器成功后返回) DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃. DRBD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈. 工具: drbdadm:高级管理工具,管理/etc/dr

ASP.NET页面间数据传递的9种方法

本文我们将讨论的是ASP.NET页面间数据传递的几种方法,对此希望能帮助大家正确的理解ASP.NET页面间数据传递的用处以及便利性. 0.引言 Web页面是无状态的, 服务器对每一次请求都认为来自不同用户,因此,变量的状态在连续对同一页面的多次请求之间或在页面跳转时不会被保留.在用ASP.NET 设计开发一个Web系统时, 遇到一个重要的问题是如何保证数据在页面间进行正确.安全和高效地传送,Asp.net 提供了状态管理等多种技术来解决保存和传递数据问题,以下来探讨.NET 下的解决此问题的各种

C++中建立对象间消息连接的一种系统方法

用过C++进行过面向对象程序设计的用户都知道,程序中的对象很少单独存在.不考虑对象间的相互作用几乎是不可能的.所以,标识对象间的关系或建立对象间的消息连接是面向对象程序设计的一项重要任务.本文着重从C++程序设计的角度,提出一种建立对象间消息连接的实用方法.如果你想详细了解面向对象程序设计技术,请参阅有关专著.大家都知道对象是数据和方法的封装体.在C++中,它们分别表现为数据成员和成员函数.程序设计者通过执行对象的各种方法,来改变对象的状态(即改变对象的属性数据).从而使该对象发生某些"事件&q

ASP.NET页面间数据传递

0.引言 Web页面是无状态的,服务器对每一次请求都认为来自不同用户,因此,变量的状态在连续对同一页面的多次请求之间或在页面跳转时不会被保留.在用ASP.NET 设计开发一个Web系统时, 遇到一个重要的问题是如何保证数据在页面间进行正确.安全和高效地传送,Asp.net 提供了状态管理等多种技术来解决保存和传递数据问题,以下来探讨.NET 下的解决此问题的各种方法和各自的适用场合. 1.ASP.NET页面间数据传递的各种方法和分析 1.1 使用Querystring 方法 QueryStrin

asp.net不同页面间数据传递的多种方法_实用技巧

1. Get(即使用QueryString显式传递)方式:在url后面跟参数.特点:简单.方便.缺点:字符串长度最长为255个字符:数据泄漏在url中.适用数据:简单.少量.关键的数据.适用范围:传递给自己.传递给另一个目标页面:常用于2个页面间传递数据.用法:例如:url后加?UserID=-,跳转到目标页面,目标页面在伺服端可用Request.QueryString["InputText"]获取其指定参数值. 2. Post方式:通用的方式.利用form提交.特点:最常用的方法.常