您的位置:首页 > 编程语言 > C#

Observer设计模式与C#委托、事件

2008-03-26 13:03 381 查看
最近新开发了一个内容服务,该服务用于统一管理所有需要静态化的内容,例如:最近需要把个人空间和博客统一成使用相同的模板(都换肤)、这样边栏上的小栏目需要有一个统一的访问点,并且这个访问点是需要静态化数据的,内容服务就是这样的一个访问点。内容服务的具体设计在以后的文章中会有介绍,但是现在先来解决主动更新中的一个问题。

先来看看内容服务的使用方是如何获取内容服务的数据的,调用方需要传入UserName(用户名)、ContentName(内容名称),然后调用后返回的是内容的详细内容。因为UserName和ContentName都可能是多样的,某用户可能会在更新多个不同的内容。在内容服务数据源的提供方的内部实现中,需要为不同的ContentName对变化进行订阅,也就是说当某个方法或者条件被触发了,就会更新订阅这个变化的所有ContentName对应的内容。显然,使用观察者模式就再适合不过了。以下是一下比较标准的Observer模式的实现(参考<<Head First 设计模式>>)。

观察者(Observer):

public abstract class ContentObserver

public class SampleContent01Observer : ContentObserver

public class SampleContent02Observer : ContentObserver

public interface IContentSubject

public class ContentSubject : IContentSubject

ContentSubject contentSubject = new ContentSubject();

contentSubject.RegisterObserver(new SampleContent01Observer(contentSubject));

contentSubject.RegisterObserver(new SampleContent02Observer(contentSubject));

contentSubject.SendContent("billchen01");

contentSubject.SendContent("billchen02");


其实,使用C#的委托与事件也能很好的设计出一个观察者模式,并且可以具有.NET的通用特性。如下就是一个使用委托与事件重写这样的逻辑的代码。

监视对象:


public class ContentTrigger

public class ContentObservers

public class ContentChangedEventArgs : EventArgs

protected void Page_Load(object sender, EventArgs e)

private void trigger_ContentChanged(object sender, ContentTrigger.ContentChangedEventArgs e)

{

ContentTrigger trigger = (ContentTrigger)sender;

Response.Output.Write(String.Format("{0} : {1}<br/>", trigger.IsUpdate, e.UserName));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: