- 热门文章:
- · 1. 一个类似于Calendar日期控件,不用再刷新页面。
- · 一个完美的日期控件 + 一个用脚本断判日期型的方法(1)
- · 使用DataGrid动态绑定DropDownList
- · .NET 1.1中预编译ASP.NET页面实现原理浅析 [1] 自动预编译机制浅析
- · 利用ASP.NET服务器端自定义控件实现XML文件中还原表单
- · .NET概观
- · ASP.NET中的Http Handles
- · Asp.net性能优化总结(二)
- · 一个非常实用的Base64类
- · 在asp.net中为Web用户控件添加属性和事件
- · 使用.NET实现断点续传(HTTP)
- · .NET 脚本(二)
设计模式之观察者模式(Observer Pattern)(一)
我们也同样希望当数据改变时,将这个更新信息很方便的通知所有依赖于它的各个对象。
例如:我们可以使用图形、表格或者列表框显示股票的价格,当股票的价格发生改变时,我们期望同时很方便的更改其它部分。
在这种情况下我们就可以使用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方法。
运行的效果为:
相关文章:
- · .NET 脚本
- · ASP.NET分页组件更新版本
- · 一种快速存取选择条目的方案(Asp.Net+C#)
- · Asp.Net(C#)+Sql Server三层架构下数据存取方案(五)
- · Asp.Net(C#)+Sql Server三层架构下数据存取方案(四)
- · Asp.Net(C#)+Sql Server三层架构下数据存取方案(三)
- · Asp.Net(C#)+Sql Server三层架构下数据存取方案(二)
- · Asp.Net(C#)+Sql Server三层架构下数据存取方案(一)
- · 在asp.net中使用excel模板
- · 关于ASPNET在IIS一些问题的经验总结
- · 认识Whidbey
- · 小程序构成大项目之——分页显示
- · ASP.NET 数据库缓存依赖
- · Global.asax 和 HttpApplication 类
- · 办公自动化系统公文归档代码
- · Asp.net性能优化总结(一)
- · 如何在DataGrid里面产生滚动条而不滚动题头
- · Whidbey中客户端回调机制(三)
- · Whidbey中客户端回调机制(二)
- · Whidbey中客户端回调机制(一)
- · ASP.NET分页组件 0.1.0
- · INI文件的操作(ASP.NET+C#)
- · Asp.net+Xml开发网络硬盘
- · ASP.NET高级应用(3)
- · ASP.NET高级应用(2)
- · ASP.NET高级应用(1)
- · Net 是未来的趋势, 为什么?
- · 迁移到 ASP .NET:需考虑的重要问题
- · ASP+与VB.Net问答QA总汇
- · 基于.NET的Web应用框架构建模式
- · Observer模式深度探索
- · VSS控制存储过程,及其asp.net的远程调试
- · 简介使用ASP.NET访问Oracle数据库的方法
- · ASP.NET编程中的十大技巧
- · ASP.NET Whidbey中personalization和membership的一些特征
- · 使用更精简的代码保证 ASP.NET 应用程序的安全
- · ASP.NET Whidbey 中新的代码编译功能
- · ASP.NET的缓存技术
