設計模式之觀察者模式(Observer Pattern)(一)

 

  我們通常在同一時間將我們的數據表示爲各種不同的形式,比如列表、圖形等等。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

我們也同樣希望當數據改變時,將這個更新信息很方便的通知所有依賴於它的各個對象。

      例如:我們可以使用圖形、表格或者列表框顯示股票的價格,當股票的價格發生改變時,我們期望同時很方便的更改其它部分。

在這種情況下我們就可以使用Observer模式。我們可以很容易的利用Observer模式使我們的程序可以很方便的解決上面的問題。

結構圖:

觀察者模式假定保存數據的對象和顯示數據的對象是分開的,負責顯示數據的對象觀察數據對象中的改變。(如圖)                                                                            

  

 

 

 

當我們要實現Observer模式時,通常將數據對象作爲目標(Subject),各個顯示數據的對象作爲觀察者(Observer)。每一個觀察者(Observer)通過調用目標(Subject)中的一個公有(public)方法,在他所感興趣的數據中註冊(registers)自己。這樣,當數據改變時,每一個目標(Subject)通過觀察者(Observer)的接口發送更新通知。

我們定義以下兩個接口:

'Observer.vb

'定義Observer接口

Public Interface Observer

    Sub sendNotify(ByVal mesg As String) '用於發送更新通知

End Interface

 

Subject.vb

'定義Subject接口

Public Interface Subject

    Sub registerInterest(ByVal obs As observer) '用於註冊觀察者

End Interface

我們可以寫一個簡單的程序,以便更好的理解(Observer觀察者模式.。第一個窗體主窗體,它有3Radio Button,名稱爲Red, Blue and Green

我們這個主窗體類實現Subject接口,這就意味着它必須提供公有方法registerInterest,用於註冊(observer)觀察者。

     Public Sub registerInterest(ByVal obs As VBNetObserver.Observer) Implements VBNetObserver.Subject.registerInterest

        observers.Add (obs)

    End Sub

 

       我們建立兩個observer(觀察者),一個顯示顏色,另一個在一個list box中增加顏色。我們在主窗體類中顯示他們。

        Dim lscol As New listObs(Me)

        lscol.Show ()

        Dim frcol As New ColFrame(Me)

        Frcol.Show()

第一個觀察者(Observer--------- ColorFrame,它實現Observer接口,下面是部分主要代碼。

'Class ColorFrame

Public Class ColFrame

    Inherits System.Windows.Forms.Form

    Implements Observer             實現Observer接口

    Private colname As String

    Dim fnt As Font

    Dim bBrush As SolidBrush

    '構造函數

    Public Sub New(ByVal subj As Subject)

        MyBase.New()

        subj.registerInterest(Me)  註冊Observer

        ColFrame = Me

        InitializeComponent()

        fnt = New Font("arial", 18, Drawing.FontStyle.Bold)

        bBrush = New SolidBrush(Color.Black)

        AddHandler Pic.Paint, New Forms.PaintEventHandler(AddressOf paintHandler)

    End Sub

 

        Public Shadows Sub Dispose()

        MyBase.Dispose()

        components.Dispose()

    End Sub

   '----

    Public Sub sendNotify(ByVal mesg As System.String) Implements VBNetObserver.Observer.sendNotify

        colname = mesg

        Select Case mesg.ToLower

            Case "red"

                Pic.BackColor = Color.Red '

            Case "blue"

                Pic.BackColor = Color.Blue

            Case "green"

                Pic.BackColor = Color.Green

        End Select

End Sub   

   End Class

我們的listbox窗體也是一個observer觀察者,它將顏色加到列表中。下面是部分主要代碼。

public Class listObs

    Inherits System.Windows.Forms.Form

    Implements Observer

    Public Sub New(ByVal subj As Subject)

        MyBase.New()      

        listObs = Me

        InitializeComponent()

        subj.registerInterest(Me)

    End Sub

    '-----

    Public Shadows Sub Dispose()

        MyBase.Dispose()

        components.Dispose()

    End Sub

    '-----

    Public Sub sendNotify(ByVal mesg As System.String) Implements Observer.sendNotify

        lscolors.Items.Add(mesg)

    End Sub

End Class

 

      在我們的程序中,點擊主窗體中的任意一個radio button,它將調用每個註冊過的Observer(觀察者)sendNotify方法。

      運行的效果爲:

 

 

參考資料:

設計模式:利用C#Delegate來改進Observer模式 作者:盧彥
探究觀察者設計模式

        剛開始學習設計模式在.NET中的應用,希望對大家在學習過程中有所幫助!

可以寫信給我進行交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章