Evgenii Legotckoi
Evgenii LegotckoiSept. 25, 2018, 5:46 a.m.

Structural Design Patterns - Composite

Goals

  • Arrange objects into tree structures to represent entire parts of the hierarchy. The linker allows clients to treat individual objects and compositions of objects in the same way.
  • Recursive composition
  • "Directories contain entries, each of which can be a directory."
  • One-to-many hierarchy representation

Problems

An application needs to manipulate a hierarchical collection of "primitive" and "composite" objects. The processing of a primitive object is handled in one way, while the processing of a composite object can be handled in different ways. Requesting the type of an object before processing is not desirable.


Discussion

Define an abstract base class (component) that defines the behavior that should be performed in the same way for all primitive and composite objects. Subclass - primitive and composite classes. Each composite object "connects" only to the abstract type of the Component, since it manages its "children".

Use this pattern whenever you have "composites that contain components, each of which can be composited".

Child management methods [ addChild() , removeChild() ] should normally be defined in the Composite class. Unfortunately, the desire to use primitives and composite objects alike requires that these methods be moved to the abstract Component class.

Structure

Composers containing Components, each of which can be composite.

Menus containing menu items, each of which can be a menu.

Row-column GUI layout managers, which contain widgets, each of which can be a row-column GUI layout manager.

Directories containing files, each of which can be a directory.

Containers containing elements, each of which can be a container.

Example

The composer organizes objects into tree structures and allows clients to process individual objects and compositions individually. Although this example is abstract, the arithmetic expressions are Composites. An arithmetic expression consists of an operand, an operator (+ - * /), and another operand. The operand can be a number or another arithmetic expression. So 2 + 3 and (2 + 3) + (4 * 6) are valid expressions.

Control List

  1. Make sure your problem is in representing tree-like hierarchical relationships.
  2. Consider an example: "Containers containing devices, each of which can be a container." Divide them into primitive classes and container classes.
  3. Create an interface to represent the simplest node with the minimum necessary methods makes your containers and primitives interchangeable. It must specify behavior that must be performed in the same way in all primitives and containers.
  4. All container classes implement the interface.
  5. All container classes declare a one-to-many relationship with an interface.
  6. Container classes use polymorphism to delegate their container objects.
  7. Child management methods [ addChild() , removeChild() ] should normally be defined in the Composite class. Unfortunately, the desire to treat primitives and layouts uniformly may require these methods to be promoted to the abstract Component class.

Rules of thumb

  • The composer and decorator have similar structure diagrams, reflecting the fact that both rely on recursive composition to organize an open number of objects.
  • The layout can be moved using an iterator. Visitor can apply an operation on layouts. The linker can use Chain of Responsibility to allow components to access global properties through their parent. It can also use a Decorator to override these properties piece by piece. It can use an Observer to bind one object structure to another and state so that the component changes its behavior as the state changes.
  • The linker may allow you to create a pick from smaller parts using recursive composition.
  • The decorator is for adding properties to objects without a subclass. Hence, the layout and decorator are often used together.
  • Flyweight is often combined with Composite to implement common leaf nodes.
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

Comments

Only authorized users can post comments.
Please, Log in or Sign up
d
  • dsfs
  • April 26, 2024, 4:56 a.m.

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:80points,
  • Rating points4
d
  • dsfs
  • April 26, 2024, 4:45 a.m.

C++ - Test 002. Constants

  • Result:50points,
  • Rating points-4
d
  • dsfs
  • April 26, 2024, 4:35 a.m.

C++ - Test 001. The first program and data types

  • Result:73points,
  • Rating points1
Last comments
k
kmssrFeb. 8, 2024, 6:43 p.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVADec. 25, 2023, 10:30 a.m.
Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJoDec. 25, 2023, 8:38 a.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
GvozdikDec. 18, 2023, 9:01 p.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
G
GarApril 22, 2024, 5:46 a.m.
Clipboard Как скопировать окно целиком в clipb?
DA
Dr Gangil AcademicsApril 20, 2024, 7:45 a.m.
Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
a
a_vlasovApril 14, 2024, 6:41 a.m.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел ДорофеевApril 14, 2024, 2:35 a.m.
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrexApril 4, 2024, 4:47 a.m.
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

Follow us in social networks