NET Framework中已使用的设计模式Word文件下载.docx
《NET Framework中已使用的设计模式Word文件下载.docx》由会员分享,可在线阅读,更多相关《NET Framework中已使用的设计模式Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
reAlreadyUsinginthe.NETFramework及加入了相关设计模式的UML表示和主要介绍。
主要内容如下:
∙.NETFramework中使用的观察者模式(ObserverPattern)
∙.NETFramework中使用的迭代器模式(IteratorPattern)
∙.NETFramework中使用的装饰模式(DecoratorPattern)
∙.NETFramework中使用的适配器模式(AdapterPattern)
∙.NETFramework中使用的工厂模式(FactoryPattern)
∙.NETFramework中使用的策略模式(StrategyPattern)
∙ASP.NET中的组合模式(CompositePattern)
∙.NETFramework中使用的模板方法模式(TemplateMethodPattern)
∙ASP.NET管道中的模式(PatternsintheASP.NETPipeline)
o截取过滤器模式(InterceptingFilterPattern)
o页面控制器模式(PageControllerPattern)
oASP.NET中的其它web表示模式(OtherWebPresentationPatternsinASP.NET)
∙总结
1、观察者模式(ObserverPattern)
观察者模式:
在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。
这通常通过调用各观察者所提供的方法来实现。
它的UML表示如下:
图1、观察者模式的UML表示(来源:
维基百科)
好的面向对象设计都强调封装(encapsulation)和松耦合(loosecoupling)。
换句话说,类应该保持内部细节私有并且最小化类之间严格的依赖关系。
大部分应用程序,类并不是独立工作的,而是与其他类交互的。
类交互的一个通常例子是:
一个类应该(观察者,Observer)被通知,当被观察者(Subject)的某些东西改变了。
例如,当单击一个按钮后可能某些WindowsForms的控件需要更新他们的显示。
一个简单的解决方案是,当状态改变时让被观察者调用观察者特定的方法。
但是,这回引入一连串的问题。
因为被观察者需要知道调用哪个方法,这样就与特定观察者产生了紧耦合(tightcoupling)。
而且,如果当需要添加多个观察者时,不得不继续添加每个观察者方法调用的代码。
如果观察者的数量动态地改变,这将变得更复杂。
这将很难维护!
应用观察者模式能有效地解决这个问题。
可以从观察者解耦被观察者,因此在设计时和运行时观察者可以容易地添加和移除。
被观察者维护者一个对它感兴趣的观察者列表,每次被观察者的状态改变时,它对每个观察者调用Notify方法。
下面这段代码展示了一个实现示例:
viewsource
print?
01
publicabstractclassCanonicalSubjectBase
02
{
03
privateArrayList_observers=newArrayList();
04
publicvoidAdd(ICanonicalObservero)
05
06
_observers.Add(o);
07
}
08
publicvoidRemove(ICanonicalObservero)
09
10
_observers.Remove(o);
11
12
publicvoidNotify()
13
14
foreach(ICanonicalObserveroin_observers)
15
16
o.Notify();
17
18
19
20
21
publicinterfaceICanonicalObserver
22
23
voidNotify();
24
所有的观察者类实现ICanonicalObserver接口,所有的被观察者必须继承自CanonicalSubjectBase。
如果一个新的观察者想监视被观察者,Add方法可以轻松的处理而不必改变被观察者类的代码。
注意:
每个被观察者仅仅直接依赖于ICanonicalObserver接口,而不是特定的观察者。
然而使用GOF的观察者模式解决这些问题仍有一些障碍,因为被观察者必须继承一个特定的基类且观察者必须实现一个特定接口。
考虑回WindowsForms按钮的例子,.NETFramework引入了委托和事件来解决这些问题。
如果你已经编写过ASP.NET或WindowsForms程序,你可能就是有了事件和事件处理器。
事件作为被观察者,然而委托作为观察者。
下面代码展示了使用事件的观察者模式:
publicdelegatevoidEvent1Hander();
publicdelegatevoidEvent2Handler(inta);
publicclassSubject
publicSubject(){}
publicEvent1HanderEvent1;
publicEvent2HandlerEvent2;
publicvoidRaiseEvent1()
Event1Handlerev=Event1;
if(ev!
=null)ev();
publicvoidRaiseEvent2()
Event2Handlerev=Event2;
=null)ev(6);
publicclassObserver1
publicObserver1(Subjects)
25
26
s.Event1+=newEvent1Hander(HandleEvent1);
27
s.Event2+=newEvent2Handler(HandleEvent2);
28
29
publicvoidHandleEvent1()
30
31
Console.WriteLine("
Observer1-Event1"
);
32
33
publicvoidHandleEvent2(inta)
34
35
Observer1-Event2"
36
37
WindowsFormsButton控件公开一个Click事件,当button被点击时产生。
任何设计为响应这个事件的类仅需要用这个事件注册一个委托。
Button类不依赖与任何潜在的观察者,并且每个观察者仅需要知道这个事件的委托的正确类型(这里是EventHandler)。
因为EventHandler是一个委托类型而不是一个接口,每个观察者不需要实现一个额外的接口。
假定它已经包含一个与签名兼容的方法,只需要用被观察者的事件注册方法。
通过使用委托和事件,观察者模式使被观察者与观察者们之间解耦了。
2、迭代器模式(IteratorPattern)
迭代器模式:
它可以让使用者通过特定的接口巡访容器中的每一个元素而不用了解底层的实作。
图2、迭代器模式的UML表示(来源:
TerryLee的.NET设计模式(18):
迭代器模式(IteratorPattern))
许多编程任务包括操作对象的集合。
不管这些集合是简单的列表还是更复杂的,如二叉树,经常需要访问集合中的每个对象。
事实上,根据集合可能有几种不同的访问每个对象的方法,诸如从前向后、从后向前、前序或后序。
为了保持集合简单,遍历代码通常放在自己单独的类中。
存储一个对象列表的常用方法之一就是用数组。
数组类型在VisualBasic.NET和C#中都是内置类型,他们都有一个循环结构用于在数组上迭代:
foreach(C#)和ForEach(VisualBasic.NET)。
下面是一个在数组上进行迭代的简单例子:
1
int[]values=newint[]{1,2,3,4,5};
2
3
foreach(intiinvalues)
4
5
Console.Write(i.ToString()+"
"
6
这些语句在后台对数组使用了迭代器。
我们需要知道的就是它保证了循环保证了对数组中的每个元素进行一次遍历。
为了使这些语句起作用,foreach表达式中涉及的对象必须实现了IEnumerable接口。
任何实现了IEnumerable接口的对象集合都可以被遍历(枚举)。
这个接口仅有一个方法GetEnumerator(),它返回一个实现了IEnumerable的对象。
IEnumerator接口包含遍历迭代集合所需要的代码,它有一个属性Current标识当前对象、方法MoveNext()移到下一个对象、方法Reset()重新