Шаблоны проектирования — это многоразовые и эффективные решения общих проблем проектирования программного обеспечения.

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

Шаблоны проектирования впервые были описаны в книге «Шаблоны проектирования: элементы многоразового объектно-ориентированного проектирования программного обеспечения». Эта книга была написана четырьмя программистами. И они ввели 23 шаблона проектирования,эти шаблоны проектирования были разделены на 3 категории.

Творческий

Структурный

Поведение

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

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

Шаблон проектирования обычно выражается определением, диаграммой классов и собирается в каталог шаблонов.

Принципы проектирования и шаблоны проектирования. Являются ли они одинаковыми?

No,

Принципы проектирования (инкапсуляция, наследование и т. д.) и шаблоны проектирования различны. Принципы — это общие рекомендации, а шаблоны — это конкретные проектные решения, часто направленные на решение общих объектно-ориентированных задач. Шаблоны проектирования состоят из объектно-ориентированных основ.

Давайте обсудим несколько шаблонов проектирования

Паттерн стратегии

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

Согласно Вики,

«Шаблон стратегии (также известный как шаблон политики) — это поведенческий шаблон проектирования программного обеспечения, который позволяет выбирать алгоритм во время выполнения. Вместо того, чтобы напрямую реализовывать один алгоритм, код получает во время выполнения инструкции о том, какие в семействе алгоритмов для использования».

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

Эта идея использования композиции (HAS-A), а не наследования (IS-A), является еще одним важным принципом проектирования. Этот принцип гласит: если у вас есть выбор, используйте композицию вместо наследования, потому что обычно композиция приводит к более гибкому дизайну.

Шаблон адаптера

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

Адаптер находится между клиентом и адаптируемым и делегирует вызовы клиента адаптированному.

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

Шаблон наблюдателя

Шаблон Observer Design основан на отношениях между издателем и подписчиком. Любой объект может отправить запрос на подписку на объект издателя. Когда запрос получен издателем, запрашивающий объект немедленно становится подписчиком.

Шаблон наблюдателя определяет зависимость между объектами "один ко многим", поэтому при изменении состояния одного объекта все его зависимые объекты получают уведомление и автоматически обновляются.

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

Принцип открытого-закрытого проектирования гласит, что классы/код должны быть открыты для расширения, но закрыты для модификации.

Этот принцип и композиция открывают путь к другому дизайну, давайте его обсудим.

Шаблон декоратора

Шаблон декоратора динамически возлагает на объект дополнительные обязанности.

Декораторы представляют собой гибкую альтернативу подклассам для расширения функциональности.

Шаблон итератора

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

Большинство языков предоставляют дополнительные структуры для хранения коллекций объектов, таких как списки, словари и наборы. Например, Java предоставляет ArrayList, который очень похож на массив, но также имеет некоторые возможности, подобные спискам. Здесь мы сохраняем наши пункты меню в ArrayList. Достаточно просто, но что, если нам нужно написать код, работающий с несколькими из этих типов коллекций?

Есть ли способ избежать переписывания кода итерации, если мы изменим тип нашей коллекции?

Шаблон итератора предоставляет способ последовательного доступа к элементам агрегатного объекта без раскрытия его базового представления.

Проще говоря, шаблон итератора позволяет реализовать логику итерации в итераторе, и этот итератор может использоваться различными коллекциями(массив, список массивов...).

Фабричные узоры

Factory позволяет нам отделить процесс создания объектов от клиентов, которые используют эти объекты.

Этот шаблон определяет интерфейс для создания объекта, но позволяет подклассам решать, какие классы создавать экземпляры.

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

Лучше создавать фабрику, когда вам нужно создавать сложные продукты и вам нужен повышенный уровень инкапсуляции. Фабричный шаблон делает наш код более надежным, менее связанным и легко расширяемым.

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

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

Я надеюсь, что эта статья помогла вам узнать о нескольких шаблонах проектирования, их преимуществах и недостатках.

Комментируйте, делитесь и дайте мне знать, если вам это нравится, ваше небольшое усилие побуждает меня писать больше.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.