- •Лабораторная работа №4 Шаблоны проектирования
- •Теоретические сведения
- •Отношения между классами. На диаграммах классов языка uml
- •Суть паттерна
- •Решение
- •Адаптер объектов
- •Адаптер классов
- •Адаптер классов не нуждается во вложенном объекте, так как он может одновременно наследовать и часть существующего класса, и часть сервиса.
- •Фасад (Facade)
- •Концептуальный пример
- •Program.Cs:
- •Output.Txt: Результат выполнения
- •Изолирует клиентов от компонентов подсистемы Уменьшая тем самым число объектов, с которыми клиентам приходится иметь дело, упрощая работу с подсистемой.
- •Позволяет ослабить связанность между подсистемой и ее клиентами.
- •Фасад не исключает возможности приложениям напрямую обращаться к классам подсистемы, если это необходимо.
- •Заместитель (Proxy)
- •3. Локальный запуск сервиса (удалённый прокси). Когда настоящий сервисный объект находится на удалённом сервере.
- •Концептуальный пример
- •Декоратор (Decorator)
- •// Объект
- •} //Ptr2 выходит из области видимости, но объект не //освобождается, потому что есть ptr, который по-прежнему //ссылается на него } //ptr выходит из области видимости, и объект уничтожается
- •Пример на языке c#
- •Порождающие шаблоны Абстрактная фабрика (Abstract Factory)
- •1. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы.
- •3. Таким образом, еще раз - предоставляет интерфейс для создания семейств, связанных между собой, или зависимых объектов.
- •Клиент пользуется только интерфейсами, заданными в классах «Абстрактная фабрика» и «Абстрактный продукт».
- •Фабричный метод (Factory Method)
- •Void info() {
- •Void info() {
- •Void info() {
- •Int main()
- •Одиночка (Singleton) Суть паттерна
- •If(!p_instance)
- •Поведенческие шаблоны Стратегия (Strategy)
- •Стратегии построения пути.
- •Структура
- •Концептуальный пример
- •Program.Cs: Пример структуры паттерна
- •Output.Txt: Результат выполнения
- •Void useStrategy(void)
- •Void setStrategy(Strategy* o)
- •Int main(int /*argc*/, char* /*argv*/[])
- •Наблюдатель (Observer) Суть паттерна
- •Решение
- •Структура
- •Шаги реализации
- •Концептуальный пример
- •Program.Cs: Пример структуры паттерна
- •// Random.Next(…) - Метод, возвращает случайное целое число //в указанном диапазоне.
- •Output.Txt: Результат выполнения
- •Использование паттерна Observer
- •Команда (Command)
- •Структура
- •Output.Txt: Результат выполнения
- •Задания для лабораторной работы
Суть паттерна
Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Проблема
Обеспечить взаимодействие объектов с различными интерфейсами. Адаптировать, а не переписывать существующий код к требуемому интерфейсу.
Представьте, что вы делаете приложение. Ваше приложение скачивает данные из нескольких источников в формате XML, а затем рисует графики.
В какой-то момент вы решаете улучшить приложение, применив стороннюю библиотеку аналитики. Но вот беда — библиотека поддерживает только формат данных JSON, несовместимый с вашим приложением.
Решение
Вы можете создать адаптер. Это объект-переводчик, который трансформирует интерфейс или данные одного объекта в такой вид, чтобы он стал понятен другому объекту.
Адаптеры могут не только переводить данные из одного формата в другой, но и помогать объектам с разными интерфейсами, работать сообща. Это работает так:
Адаптер имеет интерфейс, который совместим с одним из объектов.
Поэтому этот объект может свободно вызывать методы адаптера.
Адаптер получает эти вызовы и перенаправляет их второму объекту, но уже в том формате и последовательности, которые понятны второму объекту.
Программа может работать со сторонней библиотекой через адаптер.
Таким образом, в приложении вы могли бы создать класс XML_To_JSON_Adapter, который бы оборачивал объект того или иного класса библиотеки аналитики.
Ваш код посылал бы адаптеру запросы в формате XML, а адаптер сначала транслировал входящие данные в формат JSON, а затем передавал бы их методам объекта аналитики.
Паттерн Адаптер (Adapter), также известный как Обертка (Wrapper), является структурным (Structural) паттерном проектирования. Его цель преобразовать интерфейс класса в другой интерфейс, который ожидают клиенты. Адаптер позволяет классам работать вместе, что иначе невозможно из-за несовместимых интерфейсов.
Примеры из реального мира:
Предположим, что на вашей карте памяти есть несколько снимков, и вам необходимо перенести их на компьютер. Для их передачи вам нужен какой-то адаптер, совместимый с портами вашего компьютера, чтобы вы могли подключить карту памяти к вашему компьютеру. В этом случае карт-ридер является адаптером.
Другим примером будет известный адаптер питания; вилка с тремя ножками не может быть подключена к розетке с двумя выводами, для этого необходимо использовать адаптер питания, который делает его совместимым с розеткой с двумя выводами.
Еще одним примером будет переводчик, переводящий слова, сказанные одним человеком другому.
Проще говоря паттерн адаптер позволяет обернуть несовместимый в противном случае объект в адаптер, чтобы сделать его совместимым с другим классом.
В разработке программного обеспечения паттерн адаптер является паттерном проектирования программного обеспечения, который позволяет использовать интерфейс существующего класса в качестве другого интерфейса. Он часто используется для того, чтобы существующие классы работали с другими без изменения их исходного кода.
Имплементация в Java – это процесс создания класса, который реализует определенный интерфейс или наследует абстрактный класс. Имплементирование позволяет классу использовать функциональность интерфейса или абстрактного класса, определяя тело всех его методов.
Основной механизм имплементации в Java реализован через ключевое слово implements.
Используйте паттерн адаптер, когда:
вы хотите использовать существующий класс, и его интерфейс не соответствует тому, который вам нужен;
вы хотите создать повторно используемый класс, который взаимодействует с несвязанными или непредвиденными классами, то есть классами, которые не обязательно имеют совместимые интерфейсы;
вам нужно использовать несколько существующих подклассов, но нецелесообразно адаптировать их интерфейс путем создания подклассов для каждого из них. Адаптер объекта может адаптировать интерфейс своего родительского класса.
большинство приложений, использующих сторонние библиотеки, используют адаптеры в качестве промежуточного уровня между приложением и сторонней библиотекой для отделения приложения от библиотеки. Если необходимо использовать другую библиотеку, для новой библиотеки требуется только адаптер без изменения кода приложения.
