|
设计模式:利用C#的Delegate来改进Observer模式(1)
Observer模式是我们应用得非常多的一个模式,因为它定义了单数据源多视图结构的消息传递基本机制和对象设计,所以在几乎所有的将表示层与数据逻辑层分开的多层应用软件上都能套用上Observer模式。本文将分析C#语言来实现该模式的代码,并且针对该模式存在的一些缺点,利用C#的一个新特性Delegate来尝试对该模式进行了一些改进。 为了让更多的人能够看明白本文,所以在此之前,我们先来了解一下Observer模式的基本概念。 模式名称:Observer 结构图: CSdn.net/develop/article/images/14434001.GIF" align=baseline border=0> 意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 适用性: 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。 应用实例: 在编写多层应用程序时,我们通常将表示层和数据逻辑层分隔开,比如很常见的View/Document结构,这种设计方式的好处带来的结果通常是使用多视图同时表示单一数据源,比如一个Web网站可以方便的同时拥有针对电脑的Html页面和针对手机的WAP页面。使用这种结构时,为了保持数据显示的一致性,必须要求数据源在数据发生改变时能及时的逐一通知每一个和它绑定的表示层进行更新。但是问题在于数据层本身并不知道到底有多少个不同的表示层正在反映着它的数据内容。因此需要设计一套有效的机制来完成这个目标。 模式实现: 我们先看看来自《设计模式迷你手册》的常规的C#实现代码。 Subject(抽象目标): 目标知道它的观察者。可以有任意多个观察者观察同一个目标。 //实现代码 class Subject { //由于不知道有多少个观察者,所以建立了一个观察者链表 private ArrayList list = new ArrayList(); private string strImportantSubjectData = "Initial"; public string ImportantSubjectData { get { return strImportantSubjectData; } set { strImportantSubjectData = value; } } public void Attach(Observer o) { list.Add(o); o.ObservedSubject = this; } public void Detach(Observer o) { } public void Notify() { //在数据发生改变后遍历列表通知观察者 foreach (Observer o in list)
|