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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#設計模式-模板方法模式(Template Method)C#設計模式
- 人人都會設計模式—模版方法模式–Template-Method設計模式
- Head First 設計模式 —— 09. 模版方法 (Template Method) 模式設計模式
- 使用C# (.NET Core) 實現模板方法模式 (Template Method Pattern)C#模式
- redis的事件處理機制Redis事件
- Java——事件處理機制概要Java事件
- Nginx 超時事件的處理機制Nginx事件
- 二、GO 程式設計模式:錯誤處理Go程式設計設計模式
- Redis使用IO多路複用進行事件處理機制Redis事件
- 設計模式之釋出訂閱模式(4) Guava Eventbus 事件處理設計模式Guava事件
- 深入 Go 的錯誤處理機制,理解設計思想Go
- React學習手記3-事件處理React事件
- Python使用struct處理二進位制PythonStruct
- Linux(伺服器程式設計):15---兩種高效的事件處理模式(reactor模式、proactor模式)Linux伺服器程式設計事件模式React
- .NET----錯誤和異常處理機制
- 異常處理機制(二)之異常處理與捕獲
- 【設計模式筆記】(二)- Builder模式設計模式筆記UI
- 設計模式--工廠方法模式(Factory Method Pattern)設計模式
- [轉] Scala 中的非同步事件處理非同步事件
- Java-GUI程式設計之事件處理JavaGUI程式設計事件
- 設計模式學習筆記(二)工廠模式、模板模式和策略模式的混合使用設計模式筆記
- ios手機處理keyup事件時的相容性問題iOS事件
- Java 的異常處理機制Java
- java中的垃圾處理機制Java
- SpringMVC異常的處理機制SpringMVC
- java異常的處理機制Java
- 異常處理機制
- 深入 Go 的錯誤處理機制,學會如何使用Go
- .net 預處理指令符的使用
- 知乎 node事件機制 轉載事件
- 非同步程式設計之事件迴圈機制非同步程式設計事件
- iOS設計模式2 - 觀察者模式_通知機制iOS設計模式
- React學習筆記-事件處理React筆記事件
- 使用C# (.NET Core) 實現簡單工廠(Simple Factory) 和工廠方法設計模式 (Factory Method Pattern)C#設計模式
- Flink的視窗處理機制(一)
- Java 中的異常處理機制Java
- Java異常處理機制Java
- Java - 反射機制與工廠設計模式Java反射設計模式
- Java - 反射機制與單例設計模式Java反射單例設計模式