.NET Framework中使用了哪些设计模式?

Sri*_*ddi 29 .net design-patterns

.NET Framework中的哪些类实现了各种设计模式,如装饰器,工厂等?

jri*_*sta 46

那么,你的要求可能是一个非常广泛的列表,因为设计模式在整个.NET平台上使用.以下是我能想到的一些例子:

适配器

适配器模式,桥接系统和平台的一个共同的机制,在各种在.NET框架的方式实现的..NET中最常见的一个例子是Runtime Callable Wrappers,或RCW.RCW由tlbimp.exe程序生成,提供适配器,使.NET托管代码可以通过.NET API轻松调用传统的COM代码.

工厂方法

工厂方法模式可能是最知名的图案之一.它在整个.NET框架中非常普遍地实现,特别是在原始时代,但也在许多其他时候.框架中这种模式的一个很好的例子是Convert类,它提供了许多方法来从其他公共基元创建公共基元.

此外,此模式的另一种普遍形式是在许多原始和基本类型上找到的.Parse()和.TryParse()方法.

迭代器

迭代器模式是通过一对夫妇的接口和一些语言构造,像的foreach在C#中所述屈服关键字来实现.该IEnumerable的接口和通用对口由数十名在.NET框架的集合,允许一个非常广泛的数据集的轻松,动态迭代的实现:

IEnumerable<T>
IEnumerator<T>

foreach(var thing in someEnumerable)
{
   //
}
Run Code Online (Sandbox Code Playgroud)

所述yeild在C#关键字允许的真正形式的迭代器得以实现,仅招致当迭代要求通过一个循环处理迭代的成本:

IEnumerable<string> TokenizeMe(string complexString)
{
    string[] tokens = complexString.Split(' ');
    foreach (string token in toekens)
    {
        yield return token;
    }
}
Run Code Online (Sandbox Code Playgroud)

生成器

生成器模式是在.NET框架中实现了几次.几个注意事项是连接字符串构建器.连接字符串可能是一个挑剔的东西,在运行时动态构建它们有时会很痛苦.Connection String Builder类理想地演示构建器模式:

string connectionString = new SqlConnectionStringBuilder
{
    DataSource = "localhost",
    InitialCatalog = "MyDatabase",
    IntegratedSecurity = true,
    Pooling = false
}.ConnectionString;
Run Code Online (Sandbox Code Playgroud)

整个.NET框架中的其他类(如UriBuilder)也实现了构建器模式.

观察

观察者模式是一种常见的模式,它允许一个类来观看的另一事件.从.NET 4开始,这种模式有两种支持:通过语言集成事件(紧密耦合的观察者),以及通过IObservable/IObserver接口(松耦合事件).

经典语言事件使用委托或强类型函数指针来跟踪事件属性中的事件回调.触发时,事件将按顺序执行每个跟踪的回调.像这样的事件在整个.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
    }
}
Run Code Online (Sandbox Code Playgroud)

.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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

装饰

装饰图案是通过一个单一的基类型提供备选表示,或形式,行为的方式.通常,需要一组通用功能,但该功能的实际实现需要更改..NET框架中的一个很好的例子是Stream类及其派生类..NET中的所有流都提供相同的基本功能,但每个流的功能不同.

    • 的MemoryStream
    • BufferedStream
    • 的FileStream
      • IsolatedStorageFileStream
    • PipeStream
      • AnonymousPipeClientStream
      • AnonymousPipeServerStream
      • NamedPipeClientStream
      • NamedPipeServerStream
    • CryptoStream的
    • GZipStream

.NET框架中使用了许多其他设计模式.从语言到框架到基本运行时概念,.NET的几乎所有方面都基于通用设计模式..NET框架的重要部分(例如ASP.NET)本身就是模式.以ASP.NET MVC框架为例,它是MVC或Model-View-Controller的Web变体的实现.WPF和Silverlight UI框架直接支持称为MVVM或Model-View-ViewModel的模式.ASP.NET管道本身是一组模式,包括拦截过滤器,页面控制器,路由器等.最后,最常用的模式之一,组成,在.NET框架中如此广泛地使用,它可能是整个框架中最基本的模式之一.


Tho*_*que 8

脱离我的头顶:

  • 抽象工厂图案在ADO.NET 2.0基础设施使用(DbProviderFactory类)
  • 模板方法模式的框架,许多地方使用(的WinForms,WPF ...)
  • 生成器模式也用于经常(DbConnectionStringBuilder,UriBuilder...)
  • 我认为预定义实例(静态属性)的StringComparer,Encoding,Color等是的变型原型图案
  • 使用.NET远程处理时,代理模式无处不在
  • 事件是Observer模式的变体
  • 所述迭代器图案在集合使用
  • 策略模式被使用,例如,在加密类

可能有更多的例子,但这就是我现在所能想到的......


sha*_*atl 5

还有,NullObject

  • 的String.Empty;
  • EventArgs.Empty;