ITPub博客

首页 > 应用开发 > IT综合 > Henry手记—使用Template Method设计模式的.NET事件处理机制(二) (转)

Henry手记—使用Template Method设计模式的.NET事件处理机制(二) (转)

原创 IT综合 作者:gugu99 时间:2008-04-26 19:45:49 0 删除 编辑
Henry手记—使用Template Method设计模式的.NET事件处理机制(二) (转)[@more@]

  Henry手记—使用Template Method设计模式的

     .NET事件处理机制(二)XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

            By Mailauthor.ASP?guid=%2Fdotnet%2Feventstrategy%2Easp%2D3%2F21%2F2002">Kevin McFarlane

           韩睿 译(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: ruigeren@sina.com

qq: 18349592

----

  声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10748419/viewspace-1003019/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    3121
  • 访问量
    2641797