在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
先来看看内容服务的使用方是如何获取内容服务的数据的,调用方需要传入UserName(用户名)、ContentName(内容名称),然后调用后返回的是内容的详细内容。因为UserName和ContentName都可能是多样的,某用户可能会在更新多个不同的内容。在内容服务数据源的提供方的内部实现中,需要为不同的ContentName对变化进行订阅,也就是说当某个方法或者条件被触发了,就会更新订阅这个变化的所有ContentName对应的内容。显然,使用观察者模式就再适合不过了。以下是一下比较标准的Observer模式的实现(参考<<Head First 设计模式>>)。 观察者(Observer):
public abstract class ContentObserver
被观察的对象(Subject):}
public interface IContentSubject
} SampleContent01Observer 与 SampleContent02Observer 都实现了抽象ContentObserver,是两个不同的观察者。 ContentSubject 是监视对象,它实现了IContentSubject接口,只要实现该接口的类也都可以成为一个监视者。其中含有: RegisterObserver方法,用于把观察者注册到监视对象中。 RemoveObserver方法,用于把已存在观察者从监对象中移除。 NotifyObservers方法,当监视对象的状态发生变化时,通知所有已注册的监视对象均会被通知。 所有监视对象都会具有这样的类拟特征。在这里要注意的是ContentSubject因为需要通知观察者,所以这里会产生一个依赖,当然依赖是一个抽象。我们平时在设计时最好养成依赖抽象而不是具体实现的习惯。 这里有它的使用方法:
ContentSubject contentSubject = new ContentSubject();
contentSubject.RegisterObserver(new SampleContent01Observer(contentSubject)); contentSubject.RegisterObserver(new SampleContent02Observer(contentSubject)); contentSubject.SendContent("billchen01"); contentSubject.SendContent("billchen02"); 其实,使用C#的委托与事件也能很好的设计出一个观察者模式,并且可以具有.NET的通用特性。如下就是一个使用委托与事件重写这样的逻辑的代码。 监视对象:
}
观察者:
public class ContentObservers
} 标准的.Net Framework事件框架模型是有一定的编码规范的:
public delegate void ContentChangedEventHandler(Object sender, ContentChangedEventArgs e);的方法签名中,Object sender表示监视对象(ContentTrigger),而ContentChangedEventArgs e包含了Observer所感兴趣的状态(通过参数形式传递)。
public class ContentChangedEventArgs : EventArgs
} 现在改用了事件模型后,监视对象就没有直接依赖于观察者了,要求观察者的方法具有与委托相同的签名,并且它们现在都依赖于EventArgs了,这样的设计比上个例子更具有灵活性,而且于.net的事件调用模型是一样的,比较容易让人接受。以下是调用例子:
protected void Page_Load(object sender, EventArgs e)
}
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论