Что ж, вы просите, вероятно, ОЧЕНЬ обширный список, так как шаблоны проектирования используются на всей платформе .NET. Вот несколько примеров, которые я могу придумать: «1001 *»
Адаптер
Шаблон адаптера , общий механизм мостовых систем и платформ, реализован различными способами в .NET Framework. Одним из наиболее распространенных примеров этого в .NET являются Runtime Callable Wrappers или RCW. RCW, сгенерированные с помощью программы tlbimp.exe
, предоставляют адаптеры, позволяющие управляемому коду .NET легко вызывать устаревший код COM с помощью .NET API.
Заводской метод
Шаблон фабричного метода , вероятно, является одним из наиболее известных шаблонов. Он реализован довольно часто во всей среде .NET, особенно в примитивные времена, но также и во многих других. Отличным примером этого шаблона в среде является класс Convert, который предоставляет множество методов для создания общих примитивов из других общих примитивов.
Кроме того, другой распространенной формой этого шаблона являются методы .Parse () и .TryParse (), найденные во многих примитивных и базовых типах.
Итератор
Шаблон Iterator реализован через пару интерфейсов и некоторые языковые конструкции, такие как foreach и ключевое слово yeild в C #. Интерфейс IEnumerable и его общий аналог реализованы десятками коллекций в платформе .NET, что позволяет легко и динамически выполнять итерацию самых разнообразных наборов данных:
IEnumerable<T>
IEnumerator<T>
foreach(var thing in someEnumerable)
{
//
}
Ключевое слово yeild
в C # позволяет реализовать истинную форму итератора , что приводит к затратам на обработку итерации в цикле только тогда, когда требуется эта итерация:
IEnumerable<string> TokenizeMe(string complexString)
{
string[] tokens = complexString.Split(' ');
foreach (string token in toekens)
{
yield return token;
}
}
Builder
Шаблон Builder реализован несколько раз в .NET Framework. Пара замечаний - это строители строки подключения. Строки подключения могут быть придирчивыми, и их динамическое построение во время выполнения может иногда быть проблемой. Классы Connection String Builder в идеале демонстрируют шаблон компоновщика:
string connectionString = new SqlConnectionStringBuilder
{
DataSource = "localhost",
InitialCatalog = "MyDatabase",
IntegratedSecurity = true,
Pooling = false
}.ConnectionString;
Другие классы в .NET Framework, такие как UriBuilder, также реализуют шаблон компоновщика.
Наблюдатель
Шаблон наблюдатель является общим шаблоном, который позволяет одному классу наблюдать за событиями другого. Начиная с .NET 4, этот шаблон поддерживается двумя способами: через встроенные в язык события (тесно связанные наблюдатели) и через интерфейсы IObservable / IObserver (слабосвязанные события).
Классический язык события используют делегаты или строго типизированные указатели функций для отслеживания обратных вызовов событий в свойствах event . Событие при запуске будет выполнять каждый из отслеживаемых обратных вызовов в последовательности. Подобные события широко используются в .NET Framework.
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 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);
}
}
}
}
декоратор
Шаблон декоратор представляет собой способ предоставления альтернативных представлений или форм поведения через один базовый тип. Довольно часто требуется общий набор функций, но фактическая реализация этих функций должна измениться. Отличным примером этого в .NET Framework является класс Stream и его производные. Все потоки в .NET предоставляют одинаковую базовую функциональность, однако каждый поток работает по-разному.
- Поток
- MemoryStream
- BufferedStream
- FileStream
- IsolatedStorageFileStream
- PipeStream
- AnonymousPipeClientStream
- AnonymousPipeServerStream
- NamedPipeClientStream
- NamedPipeServerStream
- CryptoStream
- GZipStream
Многие, многие другие шаблоны проектирования используются в .NET Framework. Почти все аспекты .NET, от языка до фреймворка и до фундаментальных концепций времени выполнения, основаны на общих шаблонах проектирования. Значительные части .NET Framework, такие как ASP.NET, сами по себе являются шаблонами. Возьмем, к примеру, среду ASP.NET MVC, которая представляет собой веб-вариант MVC, или Model-View-Controller . Платформы пользовательского интерфейса WPF и Silverlight напрямую поддерживают шаблон MVVM или Model-View-ViewModel . Сам конвейер ASP.NET представляет собой набор шаблонов, включая фильтр перехвата , контроллер страницы , маршрутизатор и т. Д. Наконец, один из наиболее часто используемых шаблонов , состав , настолько широко используется в .NET Framework, что это, вероятно, один из самых фундаментальных шаблонов всей среды.