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);
}
}
}
}
8条答案
按热度按时间lyr7nygr1#
好吧,你所要求的可能是一个非常广泛的列表,因为设计模式在整个. NET平台上都在使用。下面是我能想到的一些例子:
tlbimp.exe
程序生成的RCW提供了适配器,使. NET托管代码可以通过. NET API轻松调用遗留COM代码。此外,这种模式的另一种普遍形式是. Parse()和. TryParse()方法,这些方法存在于许多原始类型和基本类型中。
C#中的
yeild
关键字允许实现 * iterator * 的真实形式,只有在需要迭代时才产生通过循环处理迭代的成本:NET框架中的其他类(如UriBuilder)也实现了构建器模式。
经典的events使用 * delegates * 或强类型函数指针来跟踪 * event * 属性中的事件回调。当事件被触发时,将按顺序执行每个被跟踪的回调。类似这样的事件在整个. NET框架中广泛使用。
NET 4 framework的新特性是松散耦合的事件。这些事件是通过实现
IObservable<out T>
和IObserver<in T>
接口来实现的,这些接口更直接地支持原始的Observer设计模式。虽然据我所知,没有任何. NET framework类型直接实现该模式,但该模式的核心基础结构是. NET 4不可或缺的一部分。decorator模式是一种通过单个基本类型提供行为的替代表示或形式的方法。通常,需要一组公共功能,但该功能的实际实现需要改变。. 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管道本身就是模式的集合,包括 * 拦截过滤器 、 页面控制器 、 路由器 * 等。最后,最常用的模式之一 * composition *在. NET框架中使用非常广泛,因此它可能是整个框架中最基本的模式之一。
c0vxltue2#
在我的脑海里:
*抽象工厂模式用于ADO.NET 2.0基础结构(
DbProviderFactory
类)*Template Method模式用于框架的许多部分(WinForms、WPF...)
*Builder模式也经常使用(
DbConnectionStringBuilder
、UriBuilder
...)StringComparer
、Encoding
、Color
等的预定义示例(静态属性)是Prototype模式的变体可能还有更多的例子,但这是我现在能想到的全部......
b5buobof3#
此外,空对象
inkz8wg94#
ExpressionVisitor
类(Syste.Linq.Expression
命名空间)中的访问者模式。System.Web.Abstractions
中的适配器模式-以更易于单元测试的方式 Package 各种Web类(HttpRequest
、HttpResponse
)-即HttpResponseBase
。*工厂方法-
Activator.CreateInstance
-创建指定对象的示例。*迭代器模式-
IEnumerable
的所有实现。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");
强制字符串实习。62o28rlo6#
原型-指定要使用原型示例创建的对象种类,并通过复制此原型创建新对象。
带有方法Clone()的ICloneable接口是典型的原型示例。
4dc9hkyq7#
提供程序模式-用于
MembershipProvider
、RoleProvider
和ProfileProvider
。qnyhuwrf8#
复合(对象结构模式)-System.Windows.Documents的Span对象将Inline对象组合在一起,同时它们本身也是Inline对象。
装饰器(对象结构模式)-从System.Windows.Controls的Decorator类派生的类的对象,由以下定义描述:
为在单个子元素上或周围应用效果的元素(如Border或ViewBox)提供基类。
Singleton(对象创建模式)-由System. Windows的Application.Current属性返回的Application对象。来自其“备注”部分的说明:
Application是针对每个AppDomain的单一类型,它实现静态Current属性以提供对当前AppDomain的Application示例的共享访问。此设计可保证由Application管理的状态(包括共享资源和状态)可从单个共享位置访问。