.NET Framework中的哪些类实现了各种设计模式,如装饰器,工厂等?
答案 0 :(得分:44)
嗯,你要求的可能是一个非常广泛的列表,因为设计模式在整个.NET平台上使用。以下是我能想到的一些例子:
<强>适配器强>
适配器模式是桥接系统和平台的常用机制,在.NET框架中以多种方式实现。 .NET中最常见的一个例子是Runtime Callable Wrappers,或RCW。使用tlbimp.exe
程序生成的RCW提供了允许.NET托管代码通过.NET API轻松调用遗留COM代码的适配器。
工厂方法
工厂方法模式可能是最知名的模式之一。它在整个.NET框架中非常普遍地实现,特别是在原始时代,但也在许多其他时候。框架中这种模式的一个很好的例子是Convert类,它提供了许多方法来从其他公共基元创建公共基元。
此外,此模式的另一种普遍形式是在许多原始和基本类型上找到的.Parse()和.TryParse()方法。
<强>迭代强>
Iterator 模式是通过几个接口和一些语言结构实现的,比如foreach和C#中的yeild关键字。 IEnumerable接口及其通用对应物由.NET框架中的许多集合实现,允许对各种各样的数据集进行简单,动态的迭代:
IEnumerable<T>
IEnumerator<T>
foreach(var thing in someEnumerable)
{
//
}
C#中的yeild
关键字允许实现迭代器的真实形式,只需要在需要迭代时通过循环处理迭代的成本:
IEnumerable<string> TokenizeMe(string complexString)
{
string[] tokens = complexString.Split(' ');
foreach (string token in toekens)
{
yield return token;
}
}
<强>生成器强>
Builder 模式在.NET框架中实现了几次。几个注意事项是连接字符串构建器。连接字符串可能是一个挑剔的东西,在运行时动态构建它们有时会很痛苦。 Connection String Builder类理想地演示了构建器模式:
string connectionString = new SqlConnectionStringBuilder
{
DataSource = "localhost",
InitialCatalog = "MyDatabase",
IntegratedSecurity = true,
Pooling = false
}.ConnectionString;
整个.NET框架中的其他类(如UriBuilder)也实现了构建器模式。
<强>观察强>
observer 模式是一种常见模式,允许一个类观察另一个类的事件。从.NET 4开始,这种模式有两种支持:通过语言集成事件(紧密耦合的观察者),以及通过IObservable / IObserver接口(松耦合事件)。
经典语言events使用委托或强类型函数指针来跟踪事件属性中的事件回调。触发时,事件将按顺序执行每个跟踪的回调。像这样的事件在整个.NET框架中普遍使用。
public class EventProvider
{
public event EventHandler SomeEvent;
protected virtual void OnSomeEvent(EventArgs args)
{
if (SomeEvent != null)
{
SomeEvent(this, args); // Trigger event
}
}
}
public class EventConsumer
{
public EventConsumer(EventProvider provider)
{
provider.SomeEvent += someEventHandler; // Register as observer of event
}
private void someEventHandler(EventArgs args)
{
// handle event
}
}
.NET 4框架的新功能是松散耦合的事件。这些是通过实现IObservable<out T>
和IObserver<in T>
接口来实现的,这些接口更直接地支持原始的Observer设计模式。虽然我没有直接实现我所知道的任何.NET框架类型,但该模式的核心基础结构是.NET 4不可或缺的一部分。
public class SomethingObservable: IObservable<SomethingObservable>
{
private readonly List<IObserver<SomethingObservable>> m_observers;
public IDisposable Subscribe(IObserver<SomethingObservable> observer)
{
if (!m_observers.Contains(observer))
{
m_observers.Add(observer);
}
var unsubscriber = new Unsubscriber(m_observers, observer)
return unsubscriber;
}
private class Unsubscriber: IDisposable
{
public Unsubscriber(IList<IObserver<SomethingObservable>> observers, IObserver<SomethingObservable> observer)
{
m_observers = observers;
m_observer = observer;
}
private readonly IList<IObserver<SomethingObservable>> m_observers;
private readonly IObserver<SomethingObservable> m_observer;
public void Dispose()
{
if (m_observer == null) return;
if (m_observers.Contains(m_observer))
{
m_observers.Remove(m_observer);
}
}
}
}
<强>装饰强>
装饰器模式是一种通过单一基本类型提供行为的替代表示或形式的方式。通常,需要一组通用功能,但该功能的实际实现需要更改。 .NET框架中的一个很好的例子是Stream类及其派生类。 .NET中的所有流都提供相同的基本功能,但每个流的功能都不同。
.NET框架中使用了许多其他设计模式。从语言到框架到基本运行时概念,.NET的几乎所有方面都基于通用设计模式。 .NET框架的重要部分(例如ASP.NET)本身就是模式。以ASP.NET MVC框架为例,它是MVC的Web变体或 Model-View-Controller 的实现。 WPF和Silverlight UI框架直接支持名为MVVM的模式,或 Model-View-ViewModel 。 ASP.NET管道本身是一组模式,包括拦截过滤器,页面控制器,路由器等。最后,其中一个最常用模式组合在.NET框架中被广泛使用,它可能是整个框架中最基本的模式之一。
答案 1 :(得分:7)
脱离我的头顶:
DbProviderFactory
类)DbConnectionStringBuilder
,UriBuilder
...)StringComparer
,Encoding
,Color
等的预定义实例(静态属性)是原型模式的变体可能有更多的例子,但这就是我现在所能想到的......
答案 2 :(得分:5)
此外, NullObject
答案 3 :(得分:3)
ExpressionVisitor
类(Syste.Linq.Expression
命名空间中的System.Web.Abstractions
中的HttpRequest
,HttpResponse
) - 即HttpResponseBase
Activator.CreateInstance
- 创建指定对象的实例。IEnumerable
的所有实现。答案 4 :(得分:1)
原型 - 指定要使用原型实例创建的对象类型,并通过复制此原型来创建新对象。
方法Clone()的ICloneable接口是原型的经典示例。
答案 5 :(得分:0)
提供者模式 - 在MembershipProvider
,RoleProvider
,ProfileProvider
中使用。
答案 6 :(得分:0)
.Net框架中实现的更多GoF设计模式:
外观 - 子系统中一组接口的更高级别接口
MessageBox
(System.Windows.Forms) - 为某些Windows窗体界面提供可重用的高级接口,而不是编写大量代码来呈现一个只能调用{{1}的对话框}。
Steven John Metsker在 C#中的设计模式中也提到了这一点:
MessageBox类是FCL中少数几个Facade示例之一。它具有生产价值,可配置,并可重复使用。最重要的是,MessageBox类提供了一个简单的界面,可以轻松显示对话框,从而实现FACADE模式的目的。
如果您想了解更多信息,请查看the source code for MessageBox
Flyweight - 使用共享有效支持大量细粒度对象。
.Net框架使用String Interning将内存保存在相同的字符串上,这是Flyweight模式的一种实现。 Curtis Lassam的This video在解释String Interning方面做得非常出色。
您还可以通过调用MessageBox.Show("Hello world");
来强制执行字符串实习。