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

在 上例子中 传递的信息是一个字符串,当我们点击其中一个 radio button ,我们可以得到这个 radio button 的名称( Red Blue Green ),将这个名称发送到 观察者( Observer )。

Observer 提供一个对目标主体( Subject )抽象连接,一个目标主体( Subject )不知道他的 观察者( Observer )的任何信息,但是当他改变时可以更新通知发送到各个注册过的观察者( Observer )。

我们也可以使用委托( Delegate )来实现 Observer 模式

Public Class Subject

' 定义委托

Public Delegate Sub SendMessageDelegate( ByVal aPrice As String )

' 定义事件

Public Event SendMessage As SendMessageDelegate

Dim _askprice As String

Public WriteOnly Property Message() As String

Set ( ByVal Value As String )

_askprice = Value

' 引发事件

RaiseEvent SendMessage(_askprice)

End Set

End Property

End Class

在主窗体中:

Dim lscol As New listObs

Dim frcol As New frmD

Public Sub New ()

MyBase .New()

Form1 = Me

InitializeComponent()

Dim evh As EventHandler = New EventHandler( AddressOf RadioHandler)

AddHandler opRed.Click, evh

AddHandler opBlue.Click, evh

AddHandler opGreen.Click, evh

lscol.Show() ‘ 显示两个 Observer

frcol.Show()

End Sub

‘ 处理 Radio Button 的单击事件

Protected Sub RadioHandler( ByVal sender As Object , ByVal e As EventArgs)

Dim i As Integer

Dim rbut As Windows.Forms.RadioButton = CType (sender, Windows.Forms.RadioButton)

Dim subject As New subject

Dim aDelegate As subject.SendMessageDelegate = New subject.SendMessageDelegate( AddressOf lscol.Add)

Dim aDelegate1 As subject.SendMessageDelegate = New subject.SendMessageDelegate( AddressOf frcol.DrawMessage)

‘布线

AddHandler subject.SendMessage, aDelegate

AddHandler subject.SendMessage, aDelegate1

'AddHandler subject.SendMessage, AddressOf lscol.Add

'AddHandler subject.SendMessage, AddressOf frcol.DrawMessage

subject.Message = rbut.Text

‘ 撤销布线

RemoveHandler subject.SendMessage, aDelegate

RemoveHandler subject.SendMessage, aDelegate1

End Sub

在 l istbox 窗体和 ColorFrame 窗体分别定义委托所指向的事件:

‘ l istbox 窗体

Public Sub Add( ByVal mesg As System.String)

lsColors.Items.Add(mesg)

End Sub

‘ ColorFrame 窗体 ** **

Public Sub DrawMessage( ByVal mesg As System.String)

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

这样也可以实现相同的效果。

参考资料:

设计模式:利用 C# 的 Delegate 来改进 Observer 模式 作者:卢彦
探究观察者设计模式

刚开始学习设计模式在.NET中的应用,希望对大家在学习过程中有所帮助!

可以 写信 给我进行交流!

Published At
Categories with Web编程
Tagged with
comments powered by Disqus