Адаптер, Adapter или Wrapper/Обёртка — структурный шаблон проектирования, предназначенный для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс.
Задача
Система поддерживает требуемые данные и поведение, но имеет неподходящий интерфейс. Чаще всего шаблон Адаптер применяется, если необходимо создать класс, производный от вновь определяемого или уже существующего абстрактного класса.
Способ решения
Адаптер предусматривает создание класса-оболочки с требуемым интерфейсом.
Следствия
Шаблон Адаптер позволяет включать уже существующие объекты в новые объектные структуры, независимо от различий в их интерфейсах.
Реализация
Включение уже существующего класса в другой класс. Интерфейс включающего класса приводится в соответствие с новыми требованиями, а вызовы его методов преобразуются в вызовы методов включённого класса.
Пример реализации на языке ABAP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
REPORT ZNP_DP_ADAPTER. * Интерфейс который необходимо поддерживать в конечном классе INTERFACE lif_output. METHODS: generate_output. ENDINTERFACE. * Класс элементарного вывода через WRITE поддерживающий нужный интерфейс CLASS simple_op DEFINITION. PUBLIC SECTION. INTERFACES: lif_output. ENDCLASS. CLASS simple_op IMPLEMENTATION. METHOD lif_output~generate_output. WRITE: / 'Простой вывод с помощью write'. ENDMETHOD. ENDCLASS. * Класс вывода через создание дерева, не поддерживает нужный интерфейс CLASS tree_output DEFINITION. PUBLIC SECTION. METHODS: generate_tree. ENDCLASS. * CLASS tree_output IMPLEMENTATION. METHOD generate_tree. WRITE: / 'Генерация дерева.'. ENDMETHOD. ENDCLASS. * Сам класс - адаптер, реализующий нужный интерфейс и являющийся * оболочкой над классом выводящим дерево.. CLASS new_complex_op DEFINITION. PUBLIC SECTION. INTERFACES: lif_output. ENDCLASS. CLASS new_complex_op IMPLEMENTATION. METHOD lif_output~generate_output. DATA: o_tree_op TYPE REF TO tree_output. CREATE OBJECT o_tree_op. o_tree_op->generate_tree( ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. * Ссылочная переменная на подходящий интерфейс DATA: o_op TYPE REF TO lif_output. * Создаем объект с типом поддерживающим интерфейс CREATE OBJECT o_op TYPE simple_op. o_op->generate_output( ). * Создаем объект с типом поддерживающим интерфейс и являющимся адаптером * к классу выводящего вывод в виде дерева. CREATE OBJECT o_op TYPE new_complex_op. o_op->generate_output( ). |
Оригинальный пример находится тут.