Обзор паттернов
184WPF --- Периферия WPF --- Обзор паттернов
Написание компьютерных приложений является сложной задачей - приложение должно быть не только функциональным, но и гибким, чтобы эффективно поддерживать более сложные реализации. Если вы старший разработчик программного обеспечения или архитектор, вы, возможно, уже знаете, что самой сложной задачей является выяснение того, как написать код только один раз, чтобы в дальнейшем сэкономить время и сделать поддержку и расширение приложения проще в обслуживании.
При написании кода сложных бизнес-приложений, необходимо сначала учесть, что вы будете, возможно, не единственным человеком, работающим над этим проектом или приложением. Во-вторых, приложение может требовать технического обслуживания и модификации в будущем. И, наконец, повторюсь, предпочтительнее писать код только один раз.
Если вы являетесь разработчиком программного обеспечения, вы, наверное, уже испытали много проблем во время разработки приложений и у вас есть общие решения для общих проблем, которые могут встретиться позже, при разработке новых проектов. Подобное решение-код называется шаблоном проектирования (design pattern) и является общим решением для общей проблемы, которая уже была идентифицирована ранее.
В последующих нескольких статьях я предлагаю рассмотреть основные шаблоны проектирования, которые были созданы другими разработчиками программного обеспечения и помогают облегчить задачу проектирования новых бизнес-приложений. При этом нужно понимать, что шаблоны проектирования используются не только для строительства программных интерфейсов, но и для создания архитектуры приложения, для пользовательских интерфейсов и для других типичных проблем.
Классификация паттернов
Основные шаблоны проектирования, реализованные еще в 1977 году, делятся на три основные категории: создающие (creational), структурные (structural) и поведенческие (behavioral), каждый из которых имеет определенную роль. Кроме того, вы можете найти модели, специфичные для пользовательского интерфейса, а также расширенные шаблоны для архитектурных задач. Эти модели являются членами новой классификации, также известной как архитектурная классификация шаблонов (architectural design patterns classification).
Создающие шаблоны являются специфическими для решения проблем, связанных с созданием объекта. Структурные шаблоны касаются проектирования классов или объектов, а поведенческие шаблоны - связанных с проектированием объектов, способом их взаимодействия или поддержки.
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
В следующей таблице представлены модели, которые были разработаны, чтобы решить проблемы, связанные с структурой объектов или классов:
Название паттерна | Описание | Пример |
---|---|---|
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
В следующей таблице описываются шаблоны, которые были разработаны, чтобы решить проблемы, связанные с поведением и взаимодействием между объектами или классами:
Название паттерна | Описание | Пример |
---|---|---|
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()); |
Вам не нужно запоминать или полностью понимать все эти шаблоны, вместо этого вы увидите реализацию многих этих шаблонов в отдельных паттернах проектирования, которые мы рассмотрим позже.