您现在的位置: 无忧电子商务网 >> 信息学院 >> 程序开发 >> asp.net >> 正文

Observer模式深度探索

作者:作者:未…    信息学院来源:网络收集    点击数:    更新时间:2006-8-28 我要参与讨论

  ;
}

}//AskPrice property

}//Stock class

//represents the user interface in the application
public class StockDisplay {

public void AskPriceChanged(object aPrice) {
Console.Write("The new ask price is:" + aPrice + "\r\n"); }

}//StockDispslay class

public class MainClass {

public static void Main(){

//create new display and stock instances
StockDisplay stockDisplay=new StockDisplay();
Stock stock=new Stock();

//create a new delegate instance and bind it
//to the observer's askpricechanged method
Stock.AskPriceDelegate aDelegate=new
Stock.AskPriceDelegate(stockDisplay.AskPriceChanged);

//add the delegate to the event
stock.AskPriceChanged+=aDelegate;

//loop 100 times and modify the ask price
for(int looper=0;looper < 100;looper++) {
stock.AskPrice=looper;
}

//remove the delegate from the event
stock.AskPriceChanged-=aDelegate;

}//Main

}//MainClass

在熟悉了委托和事件后,您就会清楚地看到它们的巨大潜力。与IObserver和IObservable接口以及ObservableImpl类不同,使用委托和事件可大大减少实现此模式所需的工作量。CLR和编译器为观察者容器管理提供了基础,并且为注册、撤消注册和通知观察者提供了一个通用调用约定。也许,委托的最大优点是其能够引用任何方法的固有特性(条件是它符合相同的签名)。这允许任何类用作观察者,而与它所实现的接口或它专用的类无关。虽然使用IObserver和IObservable接口可减少观察者和主体类之间的耦合关系,但使用委托可完全消除这些耦合关系。
事件模式
基于事件和委托,FCL可以非常广泛地使用Observer模式。FCL的设计者充分认识到此模式的巨大潜力,并在整个框架中将其应用于用户界面和非UI特定的功能。但是,用法与基本Observer模式稍有不同,框架小组将其称为事件模式。
通常,将此模式表示为事件通知进程中所涉及的委托、事件和相关方法的正式命名约定。虽然CLR或标准编译器并没有强制要求利用事件和委托的所有应用程序和框架都采用这种模式,但Microsoft建议这样做。
其中的第一条约定也可能是最重要的约定是主体公开的事件的名称。对于它所表示的状态变化而言,此名称应该是不言自明的。切记,此约定以及所有其他此类约定本身就是主观性的。目的是为那些利用您的事件的人员提供清晰的说明。事件模式的其他部分利用正确的事件命名,因而此步骤对模式来说至关重要。
回到我们的示例,让我们分析一下这种约定对Stock类产生的影响。派生事件名称的适当方法是,利用在主体类中修改的字段的名称作为根。因为在Stock类中修改的字段名称是_askPrice,所以合理的事件名称应该是AskPriceChanged。很明显,此事件的名称比StateChangedInStockClass等具有更强的描述性。因此,AskPriceChanged事件名称符合第一条约定。
事件模式中的第二条约定是正确命名委托及其签名。委托名称应该包含事件名称(通过第一个约定选择的)及附加词Handler。此模式要求委托指定两个参数,第一个参数提供对事件发送方的引用,第二个参数向观察者提供环境信息。第一个参数的名称就是sender。必须将此参数键入为System.Object。这是由于以下事实:可能将委托绑定到系统中任何类上的任何潜在方法。第二个参数的名称(甚至比第一个参数更简单)为e。必须将此参数键入为System.EventArgs或某种派生类(有时比此内容还多)。虽然委托的返回类型取决于您的实现需要,但大多数实现此模式的委托根本不返回任何值。
需要稍加注意委托的第二个参数e。此参数允许主体对象将任意环境信息传递给观察者。如果不需要此类信息,则使用System.EventArgs实例就足够了,因为此类的实例表示没有环境数据。否则,应该使用相应的实现构造从System.EventArgs派生的类以提供此数据。必须按照具有附加词EventArgs的事件名称来命名该类。
请参考我们的Stock类,此约定要求将处理AskPriceChanged事件的委托命名为AskPriceChangedHandler。此外,应该将此委托的第二个参数命名为AskPriceChangedEventArgs。因为我们需要将新的股价传递给观察者,所以我们需要扩展System.EventArgs类,以将该类命名为AskPriceChangedEventArgs并提供实现来支持传递此数据。
事件模式中的最后一个约定是负责引发事件的主体类上方法的名称和可访问性。此方法的名称应该包含事件名称以及添加的On前缀。应该将此方法的可访问性设置为保护。此约定仅适用于非密封(在VB中不可继承)类,因为它作为派生类调用在基类中注册的观察者的已知的调用点。
将此最后一条约定应用于Stock类,即可完成事件模式。因为Stock类不是密封的,所以我们必须添加一种方法来引发事件。按照该模式,此方法的名称为OnAskPriceChanged。下面的C#代码示例显示应用于Stock类的事件模式的完整视图。请注意我们的System.Ev

上一页  [1] [2] [3] [4] [5] 下一页

在google里搜索更多Observer模式深度探索

Google
Web www.51ec.org
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
我来说两句 对此文章发表了评论
  昵 称: *必填    ·注册用户·
  评 分: 1分 2分 3分 4分 5分     严禁发表危害国家安全、政治、黄色淫秽等内容的评论,用户需对自己在使用本网站服务过程中的行为承担法律责任。本站管理员有权保留或删除评论内容,评论内容只代表机友个人观点,与本网站立场无关。  
评 论
内 容

 
评论列表 (最新 评论仅限网友观点!)

供求信息




| 设为首页 | 加入收藏 | 关于我们 | 广告服务 | 联系方式 | 友情链接 | 版权申明