Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подготовка к зачету Гадасина за 16 часов.docx
Скачиваний:
10
Добавлен:
21.01.2024
Размер:
8.53 Mб
Скачать

33. Различие между паттернами и Фреймворками

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

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

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

Сходство – подход к повторному использованию кодов.

Различие – фреймворк можно рассматривать как реализацию системы паттернов проектирования или поведенческих паттернов.

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

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

34. Основные структурные паттерны

Структурные паттерны - с одинаковой эффективностью применяются как для разделения, так и для объединения элементов приложения

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

В структурных паттернах рассматривается вопрос, как из классов и объектов формируются крупные структуры. Рассматривают два вида структурных паттернов:

  • уровня класса. Использует наследование для составления композиций из интерфейсов и реализаций. Как пример, множественное наследование, в результате получается потомок, обладающий всеми свойствами родителей. Структуры на основе наследования получаются статичными;

  • уровня объекта. Использует композицию, компонуя объекты для получения новой функциональности. Композиция позволяет получать структуры, которые можно изменять во время выполнения.

Адаптер.

Адаптер (Adapter, также известен как Wrapper) — структурный паттерн проектирования, преобразует интерфейс одного класса в интерфейс другого, который использует клиент. Позволяет обеспечить совместимую работу классов с несовместимыми интерфейсами. Особенно полезен при встраивании сторонних библиотек в приложение, так как интерфейс классов сторонних библиотек не всегда позволяет эффективно их использовать в рамках пользовательского приложения.

Преимуществом паттерна Адаптер является то, что он позволяет повторно использовать уже имеющийся код, адаптируя его несовместимый интерфейс к виду, пригодному для использования. Недостатком является то, что задача преобразования интерфейсов может оказаться непростой в случае, если клиентские вызовы и (или) передаваемые параметры не имеют функционального соответствия в адаптируемом объекте.

Мост.

Мост (Bridge) — структурный шаблон проектирования, позволяющий разделять абстракцию и реализацию так, чтобы они могли изменяться независимо. Когда абстракция и реализация разделены, они могут изменяться независимо. Другими словами, при реализации через паттерн Мост изменение структуры интерфейса не мешает изменению структуры реализации.

Компоновщик.

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

Декоратор.

Декоратор (Decorator, также известен как Wrapper) — структурный шаблон проектирования, позволяющий добавлять объекту новые обязанности. Является альтернативой порождению подклассов с целью расширения функциональности.

Паттерн Декоратор используется:

  • для динамического и прозрачного для клиентов добавления новых возможностей;

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

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

Данный паттерн обладает следующими достоинствами:

  • Большая гибкость, чем у механизма наследования. Паттерн позволяет добавлять и удалять обязанности объекта на этапе выполнения программы.

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

Также можно выделить некоторые недостатки паттерна:

  • декоратор и конечный объект не идентичны. Это вытекает из философии наследования — все порожденные потомки являются «равноправными», то есть при наследовании от класса Animal (животное) все его потомки будут являться животными, в данном же случае конечный объект и декоратор — различные сущности;

  • порождает множество различных мелких объектов.

Фасад.

Фасад (Facade) — структурный шаблон проектирования, позволяющий скрыть сложность системы путем сведения всех возможных внешних вызовов к одному объекту, который в свою очередь перенаправляет их соответствующим объектам системы.

Шаблон используется если необходимо:

  • упростить доступ к сложной системе;

  • создать различные уровни доступа к системе;

  • уменьшить число зависимостей между системой и клиентом.

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

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

Приспособленец.

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

Шаблон применяется, если:

  • в приложении используется большое число очень схожих экземпляров заданного класса;

  • часть состояния объекта является контекстной и может быть легко вынесена во внешние структуры;

  • после вынесения части состояния все экземпляры становятся одинаковыми и это дает возможность заменить их одним;

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

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

Заместитель.

Заместитель (Proxy) — структурный шаблон проектирования, который предоставляет объект, который контролирует доступ к другому объекту, перехватывая все вызовы (выполняет функцию контейнера). Паттерн позволяет управлять доступом к объекту таким образом, чтобы создавать громоздкие объекты «по требованию».

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

Преимущества данного паттерна:

  • удаленный заместитель — предоставляет локального заместителя, вместо объекта, находящегося в другом адресном пространстве или в удаленной машине (удаленный вызов процедур);

  • виртуальный заместитель может выполнять оптимизацию — создание объектов по требованию;

  • защищающий заместитель — контролирует доступ к исходному объекту (при наличии различных прав доступа к одному объекту)