在整个.NET框架中使用了哪些设计模式?

ki1q1bka  于 2022-12-24  发布在  .NET
关注(0)|答案(8)|浏览(176)

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

lyr7nygr

lyr7nygr1#

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

    • 适配器**
  • adapter * 模式是一种桥接系统和平台的常用机制,在. NET框架中以多种方式实现。. NET中最流行的示例之一是运行时可调用 Package (Runtime Callable Wrappers,简称RCW)。使用tlbimp.exe程序生成的RCW提供了适配器,使. NET托管代码可以通过. NET API轻松调用遗留COM代码。
    • 工厂方法**
  • factory method * 模式可能是最著名的模式之一。它在整个. NET框架中实现得相当普遍,特别是在原语时期,但也在许多其他时期。框架中这种模式的一个很好的例子是Convert类,它提供了大量的方法来从其他通用原语创建通用原语。

此外,这种模式的另一种普遍形式是. Parse()和. TryParse()方法,这些方法存在于许多原始类型和基本类型中。

    • 迭代器**
  • Iterator * 模式是通过几个接口和一些语言结构实现的,如C#中的foreach和yeild关键字。IEnumerable接口及其泛型对应物是通过. NET框架中的几十个集合实现的,允许对各种各样的数据集进行轻松、动态的迭代:
IEnumerable<T>
IEnumerator<T>

foreach(var thing in someEnumerable)
{
   //
}

C#中的yeild关键字允许实现 * iterator * 的真实形式,只有在需要迭代时才产生通过循环处理迭代的成本:

IEnumerable<string> TokenizeMe(string complexString)
{
    string[] tokens = complexString.Split(' ');
    foreach (string token in toekens)
    {
        yield return token;
    }
}
    • 生成器**
  • Builder * 模式在. NET Framework中实现过几次。连接字符串构建器需要注意几点。连接字符串可能是一个挑剔的东西,在运行时动态构建它们有时会很麻烦。连接字符串构建器类完美地演示了构建器模式:
string connectionString = new SqlConnectionStringBuilder
{
    DataSource = "localhost",
    InitialCatalog = "MyDatabase",
    IntegratedSecurity = true,
    Pooling = false
}.ConnectionString;

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

    • 观察员**
  • observer * 模式是一种常见模式,它允许一个类监视另一个类的事件。从. NET 4开始,该模式以两种方式得到支持:通过语言集成的事件(紧耦合的观察器),以及通过IObservable/IObserver接口(松耦合的事件)。

经典的events使用 * delegates * 或强类型函数指针来跟踪 * event * 属性中的事件回调。当事件被触发时,将按顺序执行每个被跟踪的回调。类似这样的事件在整个. 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 framework的新特性是松散耦合的事件。这些事件是通过实现IObservable<out T>IObserver<in T>接口来实现的,这些接口更直接地支持原始的Observer设计模式。虽然据我所知,没有任何. NET framework类型直接实现该模式,但该模式的核心基础结构是. 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);
            }
        }
    }
}
    • 装饰师**

decorator模式是一种通过单个基本类型提供行为的替代表示或形式的方法。通常,需要一组公共功能,但该功能的实际实现需要改变。. NET框架中的一个很好的例子是Stream类及其派生类。. NET中的所有流都提供相同的基本功能,然而每个流的功能不同。

  • 溪流
  • 内存流
  • 缓冲流
  • 文件流
  • 隔离存储文件流
  • 管道流
  • 匿名管道客户端流
  • 匿名管道服务器流
  • 命名管道客户端流
  • 命名管道服务器流
  • 加密流
  • GZipStream

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

c0vxltue

c0vxltue2#

在我的脑海里:

*抽象工厂模式用于ADO.NET 2.0基础结构(DbProviderFactory类)
*Template Method模式用于框架的许多部分(WinForms、WPF...)
*Builder模式也经常使用(DbConnectionStringBuilderUriBuilder ...)

  • 我认为StringComparerEncodingColor等的预定义示例(静态属性)是Prototype模式的变体
  • 使用.NET远程处理时,Proxy模式无处不在
  • 事件是Observer模式的变体
  • Iterator**模式用于集合中
  • 例如,在加密类中使用Strategy模式

可能还有更多的例子,但这是我现在能想到的全部......

b5buobof

b5buobof3#

此外,空对象

  • 字符串。空;
  • 事件参数为空;
inkz8wg9

inkz8wg94#

  • ExpressionVisitor类(Syste.Linq.Expression命名空间)中的访问者模式
  • System.Web.Abstractions中的适配器模式-以更易于单元测试的方式 Package 各种Web类(HttpRequestHttpResponse)-即HttpResponseBase
    *工厂方法-Activator.CreateInstance-创建指定对象的示例。
    *迭代器模式-IEnumerable的所有实现。
yebdmbv4

yebdmbv45#

一些在.Net框架中实现的GoF设计模式:

Facade-子系统中一组接口的高级接口

MessageBox(System.Windows.Forms)-为一些Windows窗体接口提供了一个可重用的高级接口,而不是编写大量代码来显示一个对话框,您可以直接调用MessageBox.Show("Hello world");
Steven John Metsker在 * C#中的设计模式 * 中也提到了这一点:
MessageBox类是FCL中外观的少数几个示例之一。它适合于生产、可配置,并且是为重用而设计的。最重要的是,MessageBox类通过提供一个使显示对话框变得容易的简单接口来实现FACADE模式的意图。
如果您想了解更多信息,请查看MessageBox的源代码

Flyweight-使用共享来高效地支持大量细粒度对象。

Net框架使用字符串实习来保存相同字符串的内存,这是Flyweight模式的实现。Curtis Lassam的This video在解释字符串实习方面做得很好。
您还可以通过调用String.Intern("Hello world");强制字符串实习。

62o28rlo

62o28rlo6#

原型-指定要使用原型示例创建的对象种类,并通过复制此原型创建新对象。

带有方法Clone()的ICloneable接口是典型的原型示例。

4dc9hkyq

4dc9hkyq7#

提供程序模式-用于MembershipProviderRoleProviderProfileProvider

qnyhuwrf

qnyhuwrf8#

复合(对象结构模式)-System.Windows.Documents的Span对象将Inline对象组合在一起,同时它们本身也是Inline对象。
装饰器(对象结构模式)-从System.Windows.Controls的Decorator类派生的类的对象,由以下定义描述:

为在单个子元素上或周围应用效果的元素(如BorderViewBox)提供基类。

Singleton(对象创建模式)-由System. Windows的Application.Current属性返回的Application对象。来自其“备注”部分的说明:

Application是针对每个AppDomain的单一类型,它实现静态Current属性以提供对当前AppDomain的Application示例的共享访问。此设计可保证由Application管理的状态(包括共享资源和状态)可从单个共享位置访问。

相关问题