Design Patterns — A quick guide to Bridge pattern.

Паттерны проектирования — краткое руководство по паттерну Мост.

Nikita Goncharuk
Clean Code

--

Паттерн Мост считается одним из важнейших среди паттернов проектирования. Как правило, он используется в больших бизнес-проектах, поскольку легко позволяет упрощать классы, отделяя реализацию логики низкого уровня от определения класса высокого уровня (который обычно абстрагируется или наследуется). Цель этого руководства — раскрыть особенности паттерна Мост на простых примерах.

Паттерн Мост принадлежит к структурным паттернам дизайна, использующий композицию для работы с Классами и Объектами. Для создания интерфейсов структурные класс-образующие паттерны используют наследование. Структурные объекты-паттерны определяют способы создания объектов, расширяющих функциональные возможности. [взято с книги Design Patterns explained simply]

Шаг 1 — Ключевые Слова

Книга “Банда четырех” (GoF) написана людьми, которые первыми дали четкие определения паттернов проектирования. “Паттерн проектирования Мост отделяет абстракцию от ее реализации, так, что они могут использоваться независимо.”

  • Абстракция — это высокоуровневый интерфейс, содержащий неспецифическую реализацию какой-либо логики управления (или бизнес-логики).
  • Логика отделена от абстракции и существует в отдельном объекте, называемом “объект реализации”, который отвечает за работу на низком уровне.

Абстракция содержит ссылку на объект реализации, поэтому она может управлять его методами. Давайте детально рассмотрим пример с использованием диаграмм.

Шаг 2 — Диаграммы паттерна проектирования Мост

В данном примере у нас есть три живых организма, которые ”передвигаются” каждый по-своему:

  • Человек, который передвигается шагая. (В конце дня мы все становимся “живыми организмами”)
  • Рыба, которая передвигается плавая в воде.
  • Птица, которая летит, передвигаясь в воздухе.

Абстракция: Очевидный факт, что в выше приведенных примерах видна закономерность (паттерн). Все три объекта умеют передвигаться, но делают они это по-разному. Почему бы нам не сделать из этого абстракцию?

Как показано на схеме, класс Animal является абстракцией (или интерфейсом), так что три живых организма наследуют от него. Каждое живое существо индивидуально реализует свою специфическую логику относительно того, как они передвигаются move(). В конце концов, они объявляют собственный метод перемещения.
Однако это еще не совсем то, что нам нужно, потому что паттерн Мост — связан
НЕ только с наследованием. Цель существования этого паттерна заключается в том, чтобы отделить логику движения move() от абстракции. В этом примере код Animal-классов должен быть только об определении представителей объектов живых существ.

Реализация: Каждый метод move() имеет свою логику (логику управления или бизнес-логику). Например, при ходьбе человек использует ноги по очереди, птица машет крыльями с определенной частотой и так далее.

На диаграмме показан паттерн Мост в “полный рост”. Животные не реализуют свои собственные методы move(), но у них есть ссылка на объект MoveLogic. Реализация move() отделена от интерфейса Animal. Преимущество в том, что код классе Animal меньше, а потому проще и удобнее для понимания. Разработчикам не нуждаются в классах с тысячами строк кода, не имеющего отношения к определению объекта. Кроме того, если в будущем мы хотим добавить новый класс, например, Reptile, мы сможем использовать существующий класс Swim вместо копипастинга логики внутрь класса Reptile.

Шаг 3 — Код на примере

Предлагаю скопировать код из моего git-репозитория “Andreas Poyias” или из приведенных ниже фрагментов (класс за классом, в указанной последовательности), вставить его в любой из доступных онлайн-редакторов C++ (например, c++ shell, jdoodle, onlineGDB) и запустить, чтобы увидеть результат. После прочитайте комментарии или описание (ниже). Не торопитесь, читайте внимательно (приблизительно минуту, не меньше и не больше).

Реализация:
Мы начнем с реализации объектов. У нас есть различные типы передвижения, такие как Walk и Swim, которые наследуются от MoveLogic. Каждый из этих классов содержит логику, необходимую для конкретной функции move(), ” скрывающей “ реализацию от класса Animal. Возможно это высказывание уже знакомо вам из предыдущих статьей блога (паттерн Фасад). Главное различие между этими двумя паттернами — их назначение. Кто-то скажет, что MoveLogic может также быть Фасадом, так как классы Animal не содержат и не поддерживают особенности операции перемещения.

Абстракция:
Это простое наследование от интерфейса. Каждое животное-это конструктор, получающий для инициализации объект MoveLogic. Затем животное может вызвать функцию move(), где move будет выполнять необходимую сложную логику.

Основная функция
Как и прежде, в моих примерах, основная функция работает в качестве клиента. Работа клиента проста. Вначале создаются объекты MoveLogic. Затем они передаться живым организмам, которые затем отдельно реализуют метод передвижение move().

Результат:

Следующая статья будет посвящена краткому описанию паттерна проектирования Строитель. Это творческий паттерн, который просто обязан быть в вашей базе знаний. Это даст мне четкий сигнал о том, что опубликованные статьи приносят помощь коллегам-разработчикам, и побудит создавать новый материал. Если же вы заинтересованы в описании какого-то конкретного паттерна проектирования — дайте мне знать и я в кратчайшие сроки подготовлю статью о нем.

Translated: medium.

--

--