使用Publish/Subscribe 設計模式達到對象間資料同步

來源:互聯網
上載者:User
對象|設計|資料|資料同步 使用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



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。