Composite design pattern
- originally defined as
- Compose objects into tree structures to represent part-whole hierarchies
- composite let clients treat individual objects and compositions of objects uniformly
- Compose objects into tree structures to represent part-whole hierarchies
Structure
-
The Component interface describes operations that are common to both simple and complex elements of the tree.
-
The Leaf is a basic element of a tree that doesn’t have sub-elements.
- Usually, leaf components end up doing most of the real work, since they don’t have anyone to delegate the work to.
-
The Container (aka composite) is an element that has sub-elements: leaves or other containers.
- A container doesn’t know the concrete classes of its children.
- It works with all sub-elements only via the component interface.
- Upon receiving a request, a container delegates the work to its sub-elements, processes intermediate results and then returns the final result to the client.
-
The Client works with all elements through the component interface.
- As a result, the client can work in the same way with both simple or complex elements of the tree.
Example
-
The first element in this pattern is an abstract class that sits at the root of the hierarchical tree that this pattern aims to define.
-
This abstract class, known as a component, should contain primitive properties as well as operations that would be shared with its derivatives.
-
from the abstract component class, we get two kinds of derivative classes
- a primitive element, known as a leaf, cannot have any children of their own
- The leaf represents a single element - for instance, a student or an employee or a product.
- a composite, which are collections of primitives
- can host a collection of primitives (leaves) or composites as their children.
- a composite of primitives could be a catalog of mobile phones
- or a science class with students
- or the Quality Assurance department with employees.
- a composite of primitives could be a catalog of mobile phones
- a composite of composites could be a catalog of mobile phones, laptops, and other products
- where each category is a sub-catalog
- a school with multiple subjects, each with multiple students.
- where each category is a sub-catalog
- can host a collection of primitives (leaves) or composites as their children.
- a primitive element, known as a leaf, cannot have any children of their own
-
both leaves and composites must implement a shared and uniform interface, as laid down by the parent class.
- This ensures uniformity across the structure.
- Additional methods may be added to the composites as needed, but they must adhere to the base interface.
- This ensures that the client sees uniformity across composites and primitives, and uses the same interface.
-
-
Summary
- Composite pattern allows you to define relationships and hierarchical trees of objects that stem from a base component class
- the structure allows you to define 2 kinds of nodes
- A leaf node or a single entity like a product or a person
- requests to leaf node are handled directly
- A composite that contains collections of entities
- composites can also be collection of composites
- requests sent to composites are first forwarded to member leaves, where they are individually handled
- both leaves and composites implement a uniform interface for the client, and are great for describing a relationship between objects
- A leaf node or a single entity like a product or a person