Henry手記—使用Template Method設計模式的.NET事件處理機制(二) (轉)
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
, 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 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Henry手記—使用Template Method設計模式的.NET事件處理機制(一) (轉)設計模式事件
- 設計模式-Template Method Pattern設計模式
- 設計模式之---模板方法template method的使用設計模式
- 設計模式應用之Template method模式設計模式
- C#設計模式-模板方法模式(Template Method)C#設計模式
- Henry手記-VB.net WinForm中的FORM初探(二) (轉)ORM
- 設計模式的征途—17.模板方法(Template Method)模式設計模式
- C#設計模式系列:模板方法模式(Template Method)C#設計模式
- JAVA設計模式之 模板方法模式【Template Method Pattern】Java設計模式
- Henry的VB.NET之旅(十三)—標準事件處理程式事件
- Henry的VB.NET之旅(十五)—動態事件處理方法事件
- 人人都會設計模式—模版方法模式–Template-Method設計模式
- 設計模式--模板方法模式Template method(類行為型)設計模式
- Head First 設計模式 —— 09. 模版方法 (Template Method) 模式設計模式
- 【設計模式基礎】行為模式 - 6 - 模板方法(Template Method)設計模式
- redis的事件處理機制Redis事件
- 使用C# (.NET Core) 實現模板方法模式 (Template Method Pattern)C#模式
- Henry的VB.NET之旅(十四)—動態關聯事件與處理程式事件
- Java——事件處理機制概要Java事件
- C#事件處理機制C#事件
- Henry手記:WinForm Datagrid結構剖析(二)程式 (轉)ORM
- Nginx 超時事件的處理機制Nginx事件
- Henry手記—.NET資料結構物件補遺之單連結串列(二) (轉)資料結構物件
- 設計模式、用Delphi描述-->Factory Method模式 (轉)設計模式
- Android 觸控事件處理機制Android事件
- JUnit原始碼分析 (三)——Template Method模式原始碼模式
- 二、GO 程式設計模式:錯誤處理Go程式設計設計模式
- Android的Touch事件處理機制介紹Android事件
- android的視窗機制分析------事件處理Android事件
- Struts的異常處理機制 (轉)
- 設計模式之釋出訂閱模式(4) Guava Eventbus 事件處理設計模式Guava事件
- Asp.Net 異常處理機制ASP.NET
- Henry的VB.NET之旅(十二)—事件驅動事件
- 深入 Go 的錯誤處理機制,理解設計思想Go
- 黑馬程式設計師_畢向東JAVA基礎_設計模式&異常處理機制程式設計師Java設計模式
- Java設計模式之模板模式(Template )Java設計模式
- javaScript事件(二)事件處理程式JavaScript事件
- React學習手記3-事件處理React事件