Какие шаблоны разработки используются всюду по Платформе.NET?

Какие классы в Платформе.NET реализуют различные шаблоны разработки, такие как декоратор, фабрика, и т.д.?

29
задан James Ko 1 February 2016 в 23:38
поделиться

5 ответов

Ну, то, что вы просите, вероятно, является ОЧЕНЬ обширным списком, поскольку паттерны проектирования используются во всей платформе .NET. Вот несколько примеров, которые я могу вспомнить:

Адаптер

Паттерн адаптер, общий механизм соединения систем и платформ, реализуется различными способами в платформе .NET. Одним из наиболее распространенных примеров этого в .NET являются Runtime Callable Wrappers, или RCW's. RCW, создаваемые с помощью программы tlbimp.exe, предоставляют адаптеры, которые позволяют управляемому коду .NET легко обращаться к устаревшему COM-коду через API .NET.

Фабричный метод

Паттерн фабричный метод, вероятно, является одним из самых известных паттернов. Он реализован довольно часто во всем фреймворке .NET, особенно в примитивах, но также и во многих других. Отличным примером этого паттерна во фреймворке является класс Convert, который предоставляет множество методов для создания обычных примитивов из других обычных примитивов.

Кроме того, еще одной распространенной формой этого паттерна являются методы .Parse() и .TryParse(), встречающиеся во многих примитивных и базовых типах.

Итератор

Шаблон Итератор реализуется через пару интерфейсов и некоторые языковые конструкции, такие как foreach и ключевое слово yeild в C#. Интерфейс IEnumerable и его общий аналог реализованы десятками коллекций в .

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 несколько раз. Пара примеров - это построители строк подключения. Строки соединений могут быть очень прихотливыми, и их динамическое построение во время выполнения иногда может стать проблемой. Классы Connection String Builder идеально демонстрируют шаблон строителя:

string connectionString = new SqlConnectionStringBuilder
{
    DataSource = "localhost",
    InitialCatalog = "MyDatabase",
    IntegratedSecurity = true,
    Pooling = false
}.ConnectionString;

Другие классы в .NET framework, такие как UriBuilder, также реализуют шаблон строителя.

Наблюдатель

Шаблон наблюдатель - это общий шаблон, который позволяет одному классу наблюдать за событиями другого. Начиная с .NET 4, этот паттерн поддерживается двумя способами: через интегрированные в язык события (жестко связанные наблюдатели) и через интерфейсы IObservable/IObserver (свободно связанные события).

Классические языковые события используют делегаты, или сильно типизированные указатели функций, для отслеживания обратных вызовов событий в свойствах событий. При наступлении события каждый из отслеживаемых обратных вызовов будет выполняться последовательно. Подобные события используются повсеместно в .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 и IObserver, которые более непосредственно поддерживают оригинальный шаблон проектирования 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 является класс Stream и его производные. Все потоки в .NET обеспечивают одинаковую базовую функциональность, однако каждый поток функционирует по-своему.

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

Многие, многие другие модели проектирования используются в рамках .NET. Практически все аспекты .NET, от языка и фреймворка до фундаментальных концепций среды выполнения, основаны на общих шаблонах проектирования. Значительные части структуры .NET, такие как ASP.NET, сами по себе являются паттернами. Возьмем, к примеру, фреймворк ASP.NET MVC, который является реализацией веб-варианта MVC, или Model-View-Controller. Фреймворки WPF и Silverlight UI напрямую поддерживают паттерн под названием MVVM, или Model-View-ViewModel. Сам конвейер ASP.NET представляет собой набор паттернов, включая перехватывающий фильтр, контроллер страницы, маршрутизатор и т.д. Наконец, один из наиболее часто используемых паттернов, композиция, используется в .NET настолько широко, что, вероятно, является одним из самых фундаментальных паттернов всего фреймворка.

46
ответ дан 28 November 2019 в 01:16
поделиться

Шаблон Provider - используется в MembershipProvider, RoleProvider, ProfileProvider.

0
ответ дан 28 November 2019 в 01:16
поделиться

Кроме того, NullObject

  • String.Empty;
  • EventArgs.Empty;
5
ответ дан 28 November 2019 в 01:16
поделиться
  • Шаблон посетителя в классе ExpressionVisitor (пространство имен Syste.Linq.Expression).
  • Adapter Pattern в System.Web.Abstractions - обертывание различных Web-классов (HttpRequest, HttpResponse) в более пригодный для юнит-тестирования способ - т.е. HttpResponseBase.
  • Фабричный метод - Activator.CreateInstance - создает экземпляр указанного объекта.
  • Шаблон Iterator - все реализации IEnumerable.
3
ответ дан 28 November 2019 в 01:16
поделиться

Навскидку :

  • Паттерн Abstract Factory используется в ADO. NET 2.0 (класс DbProviderFactory)
  • Шаблон Template Method используется во многих частях фреймворка (WinForms, WPF...)
  • Шаблон Builder также используется довольно часто (DbConnectionStringBuilder, UriBuilder. ...)
  • Я думаю, что предопределенные экземпляры (статические свойства) StringComparer, Encoding, Color и т.д. являются вариантом шаблона Prototype
  • Шаблон Proxy встречается везде, когда вы используете . NET remoting
  • События - это вариант шаблона Наблюдатель
  • Шаблон Итератор используется в коллекциях
  • Шаблон Стратегия используется, например, в классах криптографии

Возможно, есть еще примеры, но это все, что я могу вспомнить прямо сейчас...

8
ответ дан 28 November 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: