Компоновщик (англ. Composite pattern) — шаблон проектирования, относится к структурным паттернам, объединяет объекты в древовидную структуру для представления иерархии от частного к целому. Компоновщик позволяет клиентам обращаться к отдельным объектам и к группам объектов одинаково.
Цель
Шаблон определяет иерархию классов, которые одновременно могут состоять из примитивных и сложных объектов, упрощает архитектуру клиента, делает процесс добавления новых видов объекта более простым.
Простейшая реализация компоновщика далее в примере:
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
REPORT z_composite. " Абстрактный класс CLASS lcl_text DEFINITION ABSTRACT. PUBLIC SECTION. METHODS: ADD ABSTRACT IMPORTING io_text TYPE REF TO lcl_text, remove ABSTRACT IMPORTING io_text TYPE REF TO lcl_text, display ABSTRACT. ENDCLASS. " Символ не может содержать внутри себя другие символы CLASS lcl_symbol DEFINITION INHERITING FROM lcl_text. PUBLIC SECTION. METHODS: CONSTRUCTOR IMPORTING iv_symbol TYPE char1. METHODS: ADD REDEFINITION, remove REDEFINITION, display REDEFINITION. PRIVATE SECTION. DATA: gv_symbol TYPE char1. ENDCLASS. * CLASS lcl_symbol IMPLEMENTATION. METHOD CONSTRUCTOR. super->constructor( ). gv_symbol = iv_symbol. ENDMETHOD. "constructor METHOD ADD. " Класс не является компоновщиком, реализация методов отсутствует. ENDMETHOD. METHOD remove. ENDMETHOD. METHOD display. WRITE gv_symbol. ENDMETHOD. "display ENDCLASS. "lcl_symbol IMPLEMENTATION " Класс компоновщик включает в себя символы, определяет метод для их вывода CLASS lcl_word DEFINITION INHERITING FROM lcl_text. PUBLIC SECTION. METHODS: ADD REDEFINITION, remove REDEFINITION, display REDEFINITION. PRIVATE SECTION. DATA: lt_messages TYPE STANDARD TABLE OF REF TO lcl_text. ENDCLASS. "lcl_text DEFINITION * CLASS lcl_word IMPLEMENTATION. METHOD ADD. APPEND io_text TO lt_messages. ENDMETHOD. "ADD METHOD remove. DELETE lt_messages WHERE TABLE_LINE EQ io_text. ENDMETHOD. "remove METHOD display. DATA: lo_message TYPE REF TO lcl_text. WRITE: / ' '. LOOP AT lt_messages INTO lo_message. lo_message->display( ). ENDLOOP. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA: lo_word TYPE REF TO lcl_text, lo_symbol TYPE REF TO lcl_text. CREATE OBJECT lo_word TYPE lcl_word. CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = 'H'. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = 'E'. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = 'L'. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = 'L'. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = 'O'. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = ' '. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = 'W'. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = 'O'. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = 'R'. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = 'L'. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = 'D'. lo_word->add( lo_symbol ). CREATE OBJECT lo_symbol TYPE lcl_symbol EXPORTING iv_symbol = '!'. lo_word->add( lo_symbol ). lo_word->display( ). |