.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
设计模式之观察者模式(Observer Pattern)(二)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

上例子中传递的信息是一个字符串,当我们点击其中一个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

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

listbox窗体

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中的应用,希望对大家在学习过程中有所帮助!

可以写信给我进行交流!




相关文章

相关软件