«All architecture is design, but not all design is architecture.»
— Grady Booch

Note

Внимание! Появился более полный список паттернов — 82 паттерна с реализацией на Java

Наиболее используемые паттерны проектирования в автоматизации тестирования

Паттерны проектирования — это не только стиль и красота. Они используются, потому что автоматические тесты должны:

  • обладать чистым дизайном, что облегчает повторное использование кода без дублирования
  • легко адаптироваться к изменениям в приложении
  • легко создаваться
  • иметь низкую стоимость обслуживания

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

recipe3

Внимание

Примеры реализаций с описанием на английском языке

ПаттернКороткое описаниеРеализация
Абстрактная фабрикаПорождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемыми объектами, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся классы, реализующие этот интерфейс
АдаптерШаблон Адаптер позволяет в процессе проектирования не принимать во внимание возможные различия в интерфейсах уже существующих классов. Если есть класс, обладающий требуемыми методами и свойствами (по крайней мере, концептуально), то при необходимости всегда можно воспользоваться шаблоном Адаптер для приведения его интерфейса к нужному виду.

Близким Адаптеру является шаблон Фасад, не всегда можно отличить один от другого

МостCтруктурный шаблон проектирования, используемый в проектировании программного обеспечения чтобы «разделять абстракцию и реализацию так, чтобы они могли изменяться независимо». Шаблон bridge (от англ. — мост) использует инкапсуляцию, агрегирование и может использовать наследование для того, чтобы разделить ответственность между классами.
При частом изменении класса преимущества объектно-ориентированного подхода становятся очень полезными, позволяя делать изменения в программе, обладая минимальными сведениями о реализации программы. Шаблон bridge является полезным там, где часто меняется не только сам класс, но и то, что он делает.
СтроительОтделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.
Позволяет изменять внутреннее представление продукта;
Изолирует код, реализующий конструирование и представление;
Дает более тонкий контроль над процессом конструирования.
Бизнес делегатШаблон J2EE — прячет сложности поиска и создания бизнес-сервисов.
Цепочка ответственностиПоведенческий шаблон проектирования, предназначенный для организации в системе уровней ответственности.
Шаблон рекомендован для использования в условиях:
— в разрабатываемой системе имеется группа объектов, которые могут обрабатывать сообщения определенного типа;
— все сообщения должны быть обработаны хотя бы одним объектом системы;
— сообщения в системе обрабатываются по схеме «обработай сам либо перешли другому», то есть одни сообщения обрабатываются на том уровне, где они получены, а другие пересылаются объектам иного уровня.
КомандаПоведенческий шаблон проектирования, используемый при объектно-ориентированном программировании, представляющий действие. Объект команды заключает в себе само действие и его параметры. Цель — создание структуры, в которой класс-отправитель и класс-получатель не зависят друг от друга напрямую. Организация обратного вызова к классу, который включает в себя класс-отправитель.
Известен также под именем Action (действие).
Обеспечивает обработку команды в виде объекта, что позволяет сохранять её, передавать в качестве параметра методам, а также возвращать её в виде результата, как и любой другой объект.
Например, библиотека печати может иметь класс PrintJob. Для его использования можно создать объект PrintJob, установить необходимые параметры, и вызвать метод, непосредственно отсылающий задание на печать.
КомпоновщикСтруктурный шаблон проектирования, объединяющий объекты в древовидную структуру для представления иерархии от частного к целому. Компоновщик позволяет клиентам обращаться к отдельным объектам и к группам объектов одинаково. Паттерн определяет иерархию классов, которые одновременно могут состоять из примитивных и сложных объектов, упрощает архитектуру клиента, делает процесс добавления новых видов объекта более простым.
Составная сущностьШаблон J2EE — используйте Composite Entity для моделирования, представления и управления набором взаимосвязанных персистентных объектов вместо представления их в виде индивидуальных специализированных компонентов управления данными. Компонент Composite Entity представляет граф объектов.
Объект Доступа к ДаннымBusinessObject представляет клиента данных. Это объект, который нуждается в доступе к источнику данных для получения и сохранения данных. BusinessObject может быть реализован как сессионный компонент, компонент управления данными или другой Java-объект, сервлет или вспомогательный компонент.
DataAccessObject является первичным объектом данного паттерна. DataAccessObject абстрагирует используемую реализацию доступа к данным для BusinessObject, обеспечивая прозрачный доступ к источнику данных. BusinessObject передает также ответственность за выполнение операций загрузки и сохранения данных объекту DataAccessObject.
Декоратор или обёрткаCтруктурный шаблон проектирования, предназначенный для динамического подключения дополнительного поведения к объекту. Шаблон Декоратор предоставляет гибкую альтернативу практике создания подклассов с целью расширения функциональности. Задачи — объект, который предполагается использовать, выполняет основные функции. Однако может потребоваться добавить к нему некоторую дополнительную функциональность, которая будет выполняться до, после или даже вместо основной функциональности объекта.
ФасадCтруктурный шаблон проектирования, позволяющий скрыть сложность системы путем сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.
Как обеспечить унифицированный интерфейс с набором разрозненных реализаций или интерфейсов, например, с подсистемой, если нежелательно высокое связывание с этой подсистемой или реализация подсистемы может измениться?
Определить одну точку взаимодействия с подсистемой — фасадный объект, обеспечивающий общий интерфейс с подсистемой, и возложить на него обязанность по взаимодействию с её компонентами. Фасад — это внешний объект, обеспечивающий единственную точку входа для служб подсистемы. Реализация других компонентов подсистемы закрыта и не видна внешним компонентам. Фасадный объект обеспечивает реализацию GRASP паттерна Устойчивый к изменениям (Protected Variations) с точки зрения защиты от изменений в реализации подсистемы.
ФабрикаПорождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.
Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанциировать. Фабричный метод позволяет классу делегировать создание подклассов. Используется, когда:
— классу заранее неизвестно, объекты каких подклассов ему нужно создавать.
— класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами.
— класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя.
КритерийПредназначен для реализации фильтрации набора объектов. Часто называется паттерном Criteria
ПриспособленецCтруктурный шаблон проектирования, при котором объект, представляющий себя как уникальный экземпляр в разных местах программы, по факту не является таковым. Flyweight используется для уменьшения затрат при работе с большим количеством мелких объектов. При проектировании приспособленца необходимо разделить его свойства на внешние и внутренние. Внутренние свойства всегда неизменны, тогда как внешние могут отличаться в зависимости от места и контекста применения и должны быть вынесены за пределы приспособленца.
Flyweight дополняет шаблон Factory Method таким образом, что при обращении клиента к Factory Method для создания нового объекта ищет уже созданный объект с такими же параметрами, что и у требуемого, и возвращает его клиенту. Если такого объекта нет, то фабрика создаст новый.
Единая точка входаВ сложных веб-сайтах есть много одинаковых действий, которые надо производить во время обработки запросов. Это, например, контроль безопасности, многоязычность и настройка интерфейса пользователя. Когда поведение входного контроллера разбросано между несколькими объектами, дублируется большое количество кода. Помимо прочего возникают сложности смены поведения в реальном времени.
Паттерн Front Controller объединяет всю обработку запросов, пропуская запросы через единственный объект-обработчик. Этот объект содержит общую логику поведения, которая может быть изменена в реальном времени при помощи декораторов. После обработки запроса контроллер обращается к конкретному объекту для отработки конкретного поведения.
Перехватывающий фильтрШаблон J2EE — обеспечивает централизованную точку входа для управления обработкой запроса.
Ситуация — механизм обработки запросов яруса презентации имеет дело с различными типами запросов, требующих разные методы их обработки. Одни запросы просто пересылаются соответствующему компоненту обработчика, а другие перед обработкой необходимо модифицировать, проверить или распаковать.
ИнтерпретаторПоведенческий шаблон проектирования, решающий часто встречающуюся, но подверженную изменениям, задачу. Также известен как Little (Small) Language. Проблема — имеется часто встречающаяся, подверженная изменениям задача.
ИтераторПредставляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из агрегированных объектов.
Например, такие элементы как дерево, связанный список, хэш-таблица и массив могут быть пролистаны (и модифицированы) с помощью объекта Итератор.
Перебор элементов выполняется объектом итератора, а не самой коллекцией. Это упрощает интерфейс и реализацию коллекции, а также способствует более логичному разделению обязанностей.
ПосредникПоведенческий шаблон проектирования, обеспечивающий взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга. Проблема — обеспечить взаимодействие множества объектов, сформировав при этом слабую связанность и избавив объекты от необходимости явно ссылаться друг на друга. Решение — создать объект, инкапсулирующий способ взаимодействия множества объектов.
ХранительПоведенческий шаблон проектирования, позволяющий, не нарушая инкапсуляцию, зафиксировать и сохранить внутреннее состояние объекта так, чтобы позднее восстановить его в это состояние.
Шаблон Хранитель используется, когда:
— необходимо сохранить снимок состояния объекта (или его части) для последующего восстановления
— прямой интерфейс получения состояния объекта раскрывает детали реализации и нарушает инкапсуляцию объекта
MVCCхема использования нескольких шаблонов проектирования, с помощью которых модель приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Данная схема проектирования часто используется для построения архитектурного каркаса, когда переходят от теории к реализации в конкретной предметной области.
Null ObjectВ таких объектно-ориентированных языках как Java или C# объекты могут иметь значение NULL. Ссылки на такие объекты нуждаются в проверке на NULL-значение перед использованием, так как методы класса «нулевого» объекта, как правило, не могут вызываться.

Целью Null-object является инкапсулирование отсутствия объекта путем замещения его другим объектом, который ничего не делает.
Данный шаблон проектирования рекомендуется ипользовать, когда:
— Объект требует взаимодействия с другими объектами. Null Object не устанавливает нового взаимодействия — он использует уже установленное взаимодействие.
— Какие-то из взаимодействующих объектов должны бездействовать
— Требуется абстрагирование «общения» с объектами, имеющими NULL-значение.

НаблюдательПоведенческий шаблон проектирования. Также известен как «подчинённые» (Dependents), «издатель-подписчик» (Publisher-Subscriber). Создает механизм у класса, который позволяет получать экземпляру объекта этого класса оповещения от других объектов об изменении их состояния, тем самым наблюдая за ними
ПрототипЗадаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа. Он позволяет уйти от реализации и позволяет следовать принципу «программирование через интерфейсы». В качестве возвращающего типа указывается интерфейсабстрактный класс на вершине иерархии, а классы наследники могут подставить туда наследника, реализующего этот тип.
Проще говоря, это паттерн создания объекта через клонирование другого объекта вместо создания через конструктор.
ПроксиCтруктурный шаблон проектирования, который предоставляет объект, который контролирует доступ к другому объекту, перехватывая все вызовы (выполняет функцию контейнера). Проблема — необходимо управлять доступом к объекту так, чтобы не создавать громоздкие объекты «по требованию». Решение — создать суррогат громоздкого объекта.
Локатор службЛокатор служб» является методом реализации «внедрения зависимости». Он возвращает разные типы объектов (компаний) в зависимости от кода инициализации.
Используйте объект Service Locator для полного абстрагирования от использования JNDI и скрытия сложностей создания исходного контекста, поиска домашнего EJB-объекта и повторного создания EJB-объекта. Объект Service Locator может повторно использоваться несколькими клиентами, что уменьшает сложность кода, обеспечивает простое управление и улучшает производительность, предоставляя функции кэширования.
Этот паттерн уменьшает сложность клиента, являющуюся результатом его зависимостей и необходимости выполнять ресурсоемкие процессы поиска и создания. Для устранения этих проблем данный паттерн предоставляет механизм абстракции всех зависимостей и деталей сетевых взаимодействий в Service Locator.
ОдиночкаПорождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.
СостояниеПоведенческий шаблон проектирования. Используется в тех случаях, когда во время выполнения программы объект должен менять свое поведение в зависимости от своего состояния.
СтратегияПоведенческий шаблон проектирования, предназначенный для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. Это позволяет выбирать алгоритм путем определения соответствующего класса. Шаблон Strategy позволяет менять выбранный алгоритм независимо от объектов-клиентов, которые его используют.
ШаблонПоведенческий шаблон проектирования, определяющий основу алгоритма и позволяющий наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.
Transfer Object PatternИспользуется, когда мы хотим передать данные с несколькими атрибутами от клиента к серверу.
ПосетительПоведенческий шаблон проектирования, описывающий операцию, которая выполняется над объектами других классов. При изменении visitor нет необходимости изменять обслуживаемые классы.
Шаблон демонстрирует классический приём восстановления информации о потерянных типах, не прибегая к понижающему приведению типов.