Обзор паттернов

184

Написание компьютерных приложений является сложной задачей - приложение должно быть не только функциональным, но и гибким, чтобы эффективно поддерживать более сложные реализации. Если вы старший разработчик программного обеспечения или архитектор, вы, возможно, уже знаете, что самой сложной задачей является выяснение того, как написать код только один раз, чтобы в дальнейшем сэкономить время и сделать поддержку и расширение приложения проще в обслуживании.

При написании кода сложных бизнес-приложений, необходимо сначала учесть, что вы будете, возможно, не единственным человеком, работающим над этим проектом или приложением. Во-вторых, приложение может требовать технического обслуживания и модификации в будущем. И, наконец, повторюсь, предпочтительнее писать код только один раз.

Если вы являетесь разработчиком программного обеспечения, вы, наверное, уже испытали много проблем во время разработки приложений и у вас есть общие решения для общих проблем, которые могут встретиться позже, при разработке новых проектов. Подобное решение-код называется шаблоном проектирования (design pattern) и является общим решением для общей проблемы, которая уже была идентифицирована ранее.

В последующих нескольких статьях я предлагаю рассмотреть основные шаблоны проектирования, которые были созданы другими разработчиками программного обеспечения и помогают облегчить задачу проектирования новых бизнес-приложений. При этом нужно понимать, что шаблоны проектирования используются не только для строительства программных интерфейсов, но и для создания архитектуры приложения, для пользовательских интерфейсов и для других типичных проблем.

Классификация паттернов

Основные шаблоны проектирования, реализованные еще в 1977 году, делятся на три основные категории: создающие (creational), структурные (structural) и поведенческие (behavioral), каждый из которых имеет определенную роль. Кроме того, вы можете найти модели, специфичные для пользовательского интерфейса, а также расширенные шаблоны для архитектурных задач. Эти модели являются членами новой классификации, также известной как архитектурная классификация шаблонов (architectural design patterns classification).

Создающие шаблоны являются специфическими для решения проблем, связанных с созданием объекта. Структурные шаблоны касаются проектирования классов или объектов, а поведенческие шаблоны - связанных с проектированием объектов, способом их взаимодействия или поддержки.

Creational Patterns

В следующей таблице представлены шаблоны, которые были разработаны, чтобы решить проблемы, связанные с созданием объектов и классов:

Разновидности создающих шаблонов (creational patterns)
Название паттерна Описание Пример
Abstract Factory Предоставляет метод фабрики для создания объектов или классов, которые связаны или зависимы, не уточняя конкретный класс. Factory.CreateProductA(); Factory.CreateProductB();
Factory Method Определяет интерфейс для создания объекта, при этом позволяет решить, какие подклассы класса используются для создания экземпляра. FactoryA.Create(); FactoryB.Create();
Builder Отделяет создание объекта от его представления, так что объект может поддерживать различные представления. Builder.BuildPartA(); Builder.BuildPartB(); Build.GetFinalProduct();
Prototype Указывает тип объектов, который необходимо создать с помощью примера прототипа и создает новые объекты путем копирования этого прототипа. Product = Prototype.Clone();
Singleton Предоставляет для доступа к экземпляру класса одну общую точку, например статический метод. Singleton.DoSomething();

Structural Patterns

В следующей таблице представлены модели, которые были разработаны, чтобы решить проблемы, связанные с структурой объектов или классов:

Разновидности структурированных шаблонов (structural patterns)
Название паттерна Описание Пример
Adapter Преобразует интерфейс класса в другой интерфейс, который клиенты ожидают. Target obj = new Adapter();
obj.DoSomething();
Bridge Отделяет абстракцию от ее реализации, так что они могут изменяться независимо. var obj = new ConcreteA();
obj.DoSomething();
obj = new ConcreteB();
obj.DoSomething();
Composite Добавляет объекты в древовидные структуры для представления сложных иерархий. Composite.Add(objA);
Composite.Add(objB);
Decorator Динамически расширяет используемый объект. obj.SetDecorator(decA);
obj.DoDecoration();
obj.SetDecorator(decB);
obj.DoDecoration();
Facade Предоставляет унифицированный интерфейс для включения других интерфейсов в подсистеме. Façade.MethodFromObjA();
Façade.MethodFromObjB();
Flyweight Структурирует множество объектов путем инкапсуляции логики их создания в одном объекте. A = FWFactory.GetFW("A");
B = FWFactory.GetFW("B");
Proxy Является заполнителем для другого типа объектов. var proxy = new Proxy();
proxy.RequestChannel();

Behavioral Patterns

В следующей таблице описываются шаблоны, которые были разработаны, чтобы решить проблемы, связанные с поведением и взаимодействием между объектами или классами:

Разновидности поведенческих шаблонов (behavioral patterns)
Название паттерна Описание Пример
Chain of Response Избегает связи отправителя с приемником, давая объекту возможность для обработки запроса. Employee.SetSupervisor(Manager);
Manager.SetSupervisor(Director);
Employee.Execute();
Command Инкапсулирует запрос в виде объекта с поддержкой различных команд. Command.DoSomething();
Command.Redo();
Command.Undo();
Interpreter Определяет представление с помощью языковых возможностей (например используется в регулярных выражениях или в некоторых реализациях шаблона Flyweight) Vocabulary.Add(expressionA);
Vocabulary.Add(expressionB);
Vocabulary.Translate();
Mediator Определяет объект, который инкапсулирует в себе набор объектов, которые могут взаимодействовать. Mediator.Add(ObjA);
Mediator.Add(ObjB);
ObjA.Send(“ObjB”, "Message");
Memento Не нарушая инкапсуляции, сохраняет внутреннее состояние объекта таким образом, что объект может быть восстановлены в этом состоянии позже (используется, например, при сериализации объектов или в LINQ to Entities). ObjA.Name = “ObjA";
Memento.Save(ObjA);
Memento.Restore(ObjA);
Observer Определяет отношение между объектами "один-ко-многим", так что когда один объект изменяется, все его дочерние объекты получают информацию об этом и автоматически обновляются. Observer.Attach(ObjA);
Observer.Attach(ObjB);
Observer.ChangeSomething();
Observer.Notify();
State Позволяет объекту изменять свое поведение когда изменяется его внутреннее состояние. Context.Add(ObjA);
ObjA.ChangeState(“A");
ObjA.ChangeState(“B”);
Strategy Определяет несколько алгоритмов для работы с наборами объектов. List.Add(ObjA);
List.Add(ObjB);
List.SortStrategy(Ascending);
List.SortStrategy(Descending);
Template Method Определяет структуру алгоритма внутри метода, при этом поведение зависит от типа класса экземпляра, переданного этому методу. Template A = new Student();
Template B = new Teacher();
A.Write(); B.Write();
Visitor Добавляет метод, для работы со структурой объектов. List.Add(Student(“A”));
List.Add(Student(“B”));
List.Visit(new VoteVisitor());

Вам не нужно запоминать или полностью понимать все эти шаблоны, вместо этого вы увидите реализацию многих этих шаблонов в отдельных паттернах проектирования, которые мы рассмотрим позже.

Пройди тесты
Лучший чат для C# программистов