Шаблон Facade (Фасад) — Шаблон проектирования, позволяющий скрыть сложность системы путем сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.
Проблема
Как обеспечить унифицированный интерфейс с набором разрозненных реализаций или интерфейсов, например, с подсистемой, если нежелательно высокое связывание с этой подсистемой или реализация подсистемы может измениться?
Решение
Определить одну точку взаимодействия с подсистемой — фасадный объект, обеспечивающий общий интерфейс с подсистемой и возложить на него обязанность по взаимодействию с её компонентами. Фасад — это внешний объект, обеспечивающий единственную точку входа для служб подсистемы. Реализация других компонентов подсистемы закрыта и не видна внешним компонентам. Фасадный объект обеспечивает реализацию паттерна Устойчивый к изменениям (Protected Variations) с точки зрения защиты от изменений в реализации подсистемы.
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 57 58 59 60 61 |
REPORT z_np_dp_facade. * CLASS lcl_data DEFINITION. PUBLIC SECTION. METHODS: CONSTRUCTOR. ENDCLASS. "lcl_Data DEFINITION * INTERFACE lif_write. METHODS: write_data. ENDINTERFACE. "lif_write DEFINITION * CLASS lcl_write_alv DEFINITION. PUBLIC SECTION. INTERFACES: lif_write. ENDCLASS. "lcl_write_alv DEFINITION * CLASS lcl_write_log DEFINITION. PUBLIC SECTION. INTERFACES: lif_write. ENDCLASS. "lcl_write_log DEFINITION * CLASS lcl_facade DEFINITION. PUBLIC SECTION. METHODS: process_report IMPORTING iv_write_type TYPE char1. ENDCLASS. "lcl_facade DEFINITION * CLASS lcl_data IMPLEMENTATION. METHOD CONSTRUCTOR. WRITE: / 'Получение данных'. ENDMETHOD. "constructor ENDCLASS. "lcl_Data IMPLEMENTATION * CLASS lcl_write_alv IMPLEMENTATION. METHOD lif_write~write_data. WRITE: / 'Вывод данных в ALV'. ENDMETHOD. "lif_write~write_Data ENDCLASS. "lcl_write_alv IMPLEMENTATION * CLASS lcl_write_log IMPLEMENTATION. METHOD lif_write~write_data. WRITE: / 'Вывод данных в журнал'. ENDMETHOD. "lif_write~write_Data ENDCLASS. "lcl_write_log IMPLEMENTATION * CLASS lcl_facade IMPLEMENTATION. METHOD process_report. DATA: lo_data TYPE REF TO lcl_data. CREATE OBJECT lo_data. DATA: lo_write TYPE REF TO lif_write. IF iv_write_type = 'A'. CREATE OBJECT lo_write TYPE lcl_write_alv. ELSE. CREATE OBJECT lo_write TYPE lcl_write_log. ENDIF. lo_write->write_data( ). ENDMETHOD. "process_report ENDCLASS. "lcl_facade IMPLEMENTATION START-OF-SELECTION. DATA: lo_facade TYPE REF TO lcl_facade. CREATE OBJECT lo_facade. lo_facade->process_report( iv_write_type = 'A' ). |
Пример реализации был взят отсюда.