Henry手記—使用Template Method設計模式的.NET事件處理機制(二) (轉)

gugu99發表於2008-04-26
Henry手記—使用Template Method設計模式的.NET事件處理機制(二) (轉)[@more@]

  Henry手記使用Template Method設計

     事件處理機制(二):namespace prefix = o ns = "urn:schemas--com::office" />

            By author.?guid=%2F%2Feventstrategy%2Easp%2D3%2F21%2F2002">Kevin McFarlane

           韓睿 譯(2002.10.14)

 

4.  示例—Template Method設計模式事件處理

下文是一段完整的用與.Net實現的示例。它由三個類組成:Supplier, ExternalClientInternalClientSupplier 觸發事件。另兩個類該事件。InternalClientSupplier派生而來。

ExternalClient包括一個嵌入的Supplier的引用。然而,它由一個InternalClient引用初始化。因此,當ExternalClientSupplier事件進行註冊時,它了InternalClient重寫的OnNameChanged()。然後該事件由InternalClientNameChanged()處理,最後由ExternalClientNameChanged()處理。

程式碼的輸出為:

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 overr void OnNameChanged()

  {

  //重寫 Supplier.NameChanged的預設行為

  Console.WriteLine("InternalClient.OnNameChanged");

  }

  private void Supplier_NameChanged( 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) 示例:

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

 

:

qq: 18349592

----

  宣告:本文版權與解釋權歸韓睿所有,如需轉載,請保留完整的內容及此宣告。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1003019/,如需轉載,請註明出處,否則將追究法律責任。

相關文章