设计模式之观察者模式(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