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

类别:.NET开发 点击:0 评论:0 推荐:

  Henry手记使用Template Method设计模式

     .NET事件处理机制(二)

            By Kevin McFarlane

           韩睿 译(2002.10.14)

 

4.      示例—Template Method设计模式事件处理

下文是一段完整的用C#Visual Basic.Net实现的示例。它由三个类组成:Supplier, ExternalClient InternalClientSupplier 触发事件。另两个类执行该事件。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 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: [email protected]

QQ: 18349592

----

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

本文地址:http://com.8s8s.com/it/it45910.htm