设计模式之观察者模式(Observer Pattern)(一)

发表于:2007-06-30来源:作者:点击数: 标签:
我们通常在同一时间将我们的数据表示为各种不同的形式,比如列表、图形等等。 我们也同样希望当数据改变时,将这个更新信息很方便的通知所有依赖于它的各个对象。 例如:我们可以使用图形、表格或者列表框显示股票的价格,当股票的价格发生改变时,我们期望同
我们通常在同一时间将我们的数据表示为各种不同的形式,比如列表、图形等等。

我们也同样希望当数据改变时,将这个更新信息很方便的通知所有依赖于它的各个对象。

例如:我们可以使用图形、表格或者列表框显示股票的价格,当股票的价格发生改变时,我们期望同时很方便的更改其它部分。

在这种情况下我们就可以使用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)观察者模式.。第一个窗体—主窗体,它有3个Radio 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方法。

运行的效果为:

原文转自:http://www.ltesting.net