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");
}
private void InternalOnNameChanged()
{
OnNameChanged();
if (NameChanged != null)
NameChanged(this, new EventArgs());
}
private string name;
}
public class InternalClient : Supplier
{
public InternalClient()
{
NameChanged += new EventHandler(this.Supplier_NameChanged);
}
protected override void OnNameChanged()
{
Console.WriteLine("InternalClient.OnNameChanged");
}
private void Supplier_NameChanged(object sender, EventArgs e)
{
Console.WriteLine("InternalClient.NameChanged");
}
}
public class ExternalClient
{
public ExternalClient()
{
supplier = new InternalClient();
supplier.NameChanged += new EventHandler(this.supplier_NameChanged);
}
public void TestSupplier()
{
supplier.Name = "Kevin McFarlane";
}
private void supplier_NameChanged(object sender, EventArgs e)
{
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
Public Class InternalClient
Inherits Supplier
Sub New()
End Sub
Protected Overrides Sub OnNameChanged()
Console.WriteLine("InternalClient.OnNameChanged")
End Sub
Private Sub Supplier_NameChanged(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.NameChanged
Console.WriteLine("InternalClient.NameChanged")
End Sub
End Class
Public Class ExternalClient
Sub New()
mSupplier = New InternalClient()
AddHandler mSupplier.NameChanged, AddressOf mSupplier_NameChanged
End Sub
Public Sub TestSupplier()
mSupplier.Name = "Kevin McFarlane"
End Sub
Private Sub mSupplier_NameChanged(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("ExternalClient.NameChanged")
End Sub
Private mSupplier As Supplier
End Class
e-mail: [email protected]
QQ: 18349592
----
声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。