Henry手记—使用Template Method设计模式的
.NET事件处理机制(二)
韩睿 译(2002.10.14)
4. 示例—Template Method设计模式事件处理
下文是一段完整的用C#与Visual Basic.Net实现的示例。它由三个类组成:Supplier
, ExternalClient
和 InternalClient
。
Supplier
触发事件。另两个类执行该事件。
InternalClient
由
Supplier
派生而来。
ExternalClient
包括一个嵌入的
Supplier
的引用。然而,它由一个
InternalClient
引用初始化。因此,当
ExternalClient
为
Supplier
事件进行注册时,它调用了
InternalClient
重写的
OnNameChanged()
。然后该事件由
InternalClient
的
NameChanged()
处理,最后由
ExternalClient
的
NameChanged()
处理。
代码的输出为:
InternalClient.OnNameChanged
InternalClient.NameChanged
ExternalClient.NameChanged
1) C#示例:
using System;
class Test
{
static void Main(string[] args)
{
ExternalClient client = new ExternalClient();
client.TestSupplier();
}
}
//当它的属性被设置时,产生一个事件
public class Supplier
{
public Supplier() {}
public event EventHandler NameChanged;
public string Name
{
get { return name; }
set { name = value; InternalOnNameChanged(); }
}
//内部使用者,也就是派生类,可以重写默认行为
protected virtual void OnNameChanged()
{
// 在此执行默认行为
Console.WriteLine("Supplier.OnNameChanged");
}
//如果内部使用者(派生类)在OnNameChanged中重写了默认行为,外部使用者仍将接受到此事件
private void InternalOnNameChanged()
{
//派生类可重写默认行为
OnNameChanged();
//在注册后,使用者即可触发此事件
if (NameChanged != null)
NameChanged(this, new EventArgs());
}
private string name;
}
// 一个处理 Supplier.NameChanged事件的“内部”使用者,但首先要重写它的默认行为
public class InternalClient : Supplier
{
public InternalClient()
{
NameChanged += new EventHandler(this.Supplier_NameChanged);
}
protected override void OnNameChanged()
{
//重写 Supplier.NameChanged的默认行为
Console.WriteLine("InternalClient.OnNameChanged");
}
private void Supplier_NameChanged(object sender, EventArgs e)
{
// 处理 Supplier.NameChanged
Console.WriteLine("InternalClient.NameChanged");
}
}
// 一个处理 Supplier.NameChanged 事件的“外部”使用者.
public class ExternalClient
{
public ExternalClient()
{
//将supplier实例化为一个InternalClient实例的引用。当一个事件被唤起时,它会触发重写的InternalClient.OnNameChanged
supplier = new InternalClient();
supplier.NameChanged += new EventHandler(this.supplier_NameChanged);
}
public void TestSupplier()
{
//下面代码会触发一个事件,并由 InternalClient和 ExternalClient 的handlers来处理
supplier.Name = "Kevin McFarlane";
}
private void supplier_NameChanged(object sender, EventArgs e)
{
// 处理 Supplier.NameChanged
Console.WriteLine("ExternalClient.NameChanged");
}
private Supplier supplier;
}
2) VB.NET示例:
Module Test
Sub Main() ‘程序入口
Dim client As ExternalClient = New ExternalClient()
client.TestSupplier()
End Sub
End Module
'当它的属性被设置时,产生一个事件
Public Class Supplier
Sub New()
End Sub
Public Event NameChanged As EventHandler
Public Property Name() As String
Get
Return mName
End Get
Set(ByVal Value As String)
mName = Value
InternalOnNameChanged()
End Set
End Property
'内部使用者,也就是派生类,可以重写默认行为
Protected Overridable Sub OnNameChanged()
'在此执行默认行为
Console.WriteLine("Supplier.OnNameChanged")
End Sub
Private Sub InternalOnNameChanged()
'派生类可重写默认行为
OnNameChanged()
'为使用者唤起事件
RaiseEvent NameChanged(Me, New EventArgs())
End Sub
Private mName As String
End Class
'一个处理 Supplier.NameChanged事件的“内部”使用者,但首先要重写它的默认行为
Public Class InternalClient
Inherits Supplier
Sub New()
End Sub
Protected Overrides Sub OnNameChanged()
'重写 Supplier.NameChanged的默认行为
Console.WriteLine("InternalClient.OnNameChanged")
End Sub
Private Sub Supplier_NameChanged(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.NameChanged
'处理 Supplier.NameChanged
Console.WriteLine("InternalClient.NameChanged")
End Sub
End Class
'一个处理 Supplier.NameChanged 事件的“外部”使用者.
Public Class ExternalClient
Sub New()
'将supplier实例化为一个InternalClient实例的引用。当一个事件被唤起时,它会触发重写的InternalClient.OnNameChanged
mSupplier = New InternalClient()
' 为 Supplier.NameChanged 事件注册
AddHandler mSupplier.NameChanged, AddressOf mSupplier_NameChanged
End Sub
Public Sub TestSupplier()
'下面代码会触发一个事件,并由 InternalClient和 ExternalClient 的handlers来处理
mSupplier.Name = "Kevin McFarlane"
End Sub
Private Sub mSupplier_NameChanged(ByVal sender As Object, ByVal e As EventArgs)
'处理 Supplier.NameChanged
Console.WriteLine("ExternalClient.NameChanged")
End Sub
Private mSupplier As Supplier
End Class
e-mail: [email protected]
QQ: 18349592
----
声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。
本文地址:http://com.8s8s.com/it/it45910.htm