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

原创 2002年10月15日 09:23:00

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

                                    .NET事件处理机制(一)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

                                         By Kevin McFarlane

                         Henry 译(2002.10.14)

 

 

   [Henry注: 本文并不复杂,可以为.net事件处理的中级读物。本文虽为翻译,但并不是完全精确之译文,加入了Henry自己的看法,如有谬误,责任在Henry矣]

 

1.      引言

Microsoft .NET事件处理,和标准的面向对象架构一样,使用的是著名的Observer设计模式(请参看书籍《设计模式(Design Patterns), Gamma et al., Addison-Wesley, 1995, pp325-330)。本文描述了如何利用Template MethodHenry注:模板方法,总觉得不翻出来更亲切)设计模式去增强.NET的事件处理机制。讨论与代码片断是基于C#的,但结论示例是使用了C#Visual Basic.NET分别实现的。

本文讨论的思想是出自于Tomas Restrepo20023月出版的《Visual Systems Journal,该文是基于Microsoft MSDN Library.NET专题提供的标准事件处理示例:《 Design Guidelines for Class Library Developers (详见文中的 "事件使用向导"一节)

对于事件处理,最简单的设计就是如何触发一个事件,而不是关心谁来执行它,或不同的使用者是否需要用不同的方法来关联它。

2.       示例简单的事件处理

 设有这样一个类:Supplier,当它的name成员被设置就会触发一个事件,而类Client就用于处理它。

[Henry注:在此示例中,我们同时可以学习一下在C#中自定义一个事件,并处理它的方法。请注意我标上[H]的代码]

一个事件的使用者即可以是外部的,也可以是内部的。

一个“外部的”使用者是指可以执行一个事件,但与触发此事件的类并无关系。换句话说,它不是事件类继承树中的一部分。示例中的Client类就是一个外部使用者。

一个“内部的”使用者可以是事件发生类自身(如果它同时处理自已的事件的话),或是该事件发生类的一个派生类。对于这种情况,上文所说的简单的设计就不够充分了。用户不能很方便地改变当事件被触发后要发生的变化,或是处理事件的默认行为了。

为了应付这个问题,在.NET Design Guidelines for Class Library Developers一文中,Microsoft推荐使用一个保护的Virtual Method(虚方法)去触发每个事件。这就提供给子类一个通过重写来处理事件的方法。因此,在我们的示例中,OnNameChanged()应该象下例这样写:

Microsoft随即说:“派生类在处理OnEventNameHenry注:OnEventName即类似于OnNameChanged的事件触发方法),可选择不调用基类。要这么做就得在OnEventName方法中不包含任何处理过程以利于基类正确地工作。”

这有一个问题,一般来说,OnNameChanged()在触发事件前可以做一些默认的处理。重写OnNameChanged()可以实现不同的处理过程。但是为保证外部的使用者工作正常,它必须调用基类。如果它不能调用基类,该事件就不能为外部使用者所用。忘记调用触发事件的基类,就违背了Liskov的多态替代原则(Henry注:出自麻省理工学院(MIT)计算机科学实验室的Barbara Liskov女士发表的经典文章Data Abstraction and Hierarchy,本文原作者做了小改动):使用指向基类的引用的方法,必须能够在不知道具体派生类对象类型的情况下使用它们。幸运的是,现在有一个解决的方法。

3.      Template Method设计模式

Template Method设计模式的目的是定义一个算法作为固定的操作步骤,但有一个或多个步骤可以有变化。Henry注:变化通常是指将某些步骤延迟到子类中去描述与执行)在我们的示例中,算法可认为是由触发事件及其响应来组成。需要有变化的地方就是响应。因此决窍就在于将它从事件触发中分离出来。我们将OnNameChanged()分割成两个方法:InternalOnNameChanged() OnNameChanged()InternalOnNameChanged()调用OnNameChanged()来执行默认的处理,然后触发事件。

Name属性改为:

使用这种方法的好处在于:

1)                  在这个触发事件的示例中,它是基类执行的重要步骤以避免派生类调用基类执行的失败。因此外部使用者可以获得更为可靠的服务;

2)                  派生类可毫不用担心,在OnNameChanged()中安全地替换基类的默认行为。

 

e-mail: ruigeren@sina.com

QQ: 18349592

----

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

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

  Henry手记—使用Template Method设计模式的     .NET事件处理机制(二)            By Kevin McFarlane           韩睿 译(2002...
  • Latitude
  • Latitude
  • 2002年10月15日 09:23
  • 1382

模板方法模式(Template Method) - 最易懂的设计模式解析

前言今天我来全面总结一下Android开发中最常用的设计模式 - 模板方法模式。 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析...
  • carson_ho
  • carson_ho
  • 2017年02月07日 15:37
  • 5106

设计模式之七:模板方法模式(Template Method)

模板方法模式: 定义了一个算法的基本操作骨架,并将算法的一些步骤延迟到子类中来实现。模板方法模式让子类在不更改算法结构的前提下可以重新定义算法的一些步骤。Define the skeleton of...
  • u012501459
  • u012501459
  • 2015年06月05日 23:33
  • 811

设计模式介绍:模板方法(Template Method)模式

应用程序开发框架中的一个基本的概念是模板方法( Template Method )模式,它是如此的常见以至于我们在使用时甚至不觉得这是个模式,达到了熟视无睹的程度。     模板方法模式的一个重...
  • bamboolsu
  • bamboolsu
  • 2015年02月19日 15:45
  • 289

设计模式系列(十二)模板方法模式(Template Method Pattern)

设计模式系列(十二)模板方法模式(Template Method Pattern)     模板方法模式是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法...
  • dan15188387481
  • dan15188387481
  • 2015年12月13日 16:41
  • 472

.NET设计模式-模版方法(Template Method)

模版方法(Template Method)摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要。主要内容1.概述2.Template M...
  • lovelacy
  • lovelacy
  • 2007年05月23日 10:46
  • 623

Java设计模式_观察者模式&事件处理机制

1.什么是观察者模式:     观察者模式:定义了对象之间的一对多依赖,可以有任意个(一个或多个)观察者对象同时监听某一个对象;这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. ...
  • qq_25804863
  • qq_25804863
  • 2015年11月07日 17:38
  • 2279

【java设计模式】之 模板方法(Template Method)模式

1. 模板方法的一个实例         这一节主要来学习一下设计模式中的模板方法模式。我们先来看一个例子:假如现在老板让你做一个汽车的模型,要求只要完成基本功能即可,不考虑扩展性,那你会怎么做呢?...
  • eson_15
  • eson_15
  • 2016年05月06日 08:57
  • 4048

C++设计模式——模板方法(Template Method)

模板方法(template method)设计模式用于定义一个包含许多步骤的算法框架,允许子类重写(覆盖)算法的某一个步骤而不改变算法整体的流程和框架。例如一个算法(如聚类算法)可能包含初始化(ini...
  • lanchunhui
  • lanchunhui
  • 2016年03月17日 16:02
  • 650

《设计模式》GoF(Gang of Four)

GoF(Gang of Four),中文名——四人组 发布时间:2009-10-11 21:25:46 技术类别:软件开发     小...
  • muzilanlan
  • muzilanlan
  • 2014年01月21日 01:29
  • 955
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Henry手记—使用Template Method设计模式的.NET事件处理机制(一)
举报原因:
原因补充:

(最多只允许输入30个字)