Introduction
A composite design pattern is a structural design pattern. It allows developers to create multiple nested objects of the same type to complete one single system hierarchy.
Players in this pattern
- Component: This player defines base contract with composite class to allow the creation of nested objects.
- Composite: This the player that will implement the contract defined by the component.
- Client: With the help of a composite player, this player will complete the system hierarchy for a particular requirement.
We will see with an example.
Requirement
Build a smart city with smart block features.
We will define 3 players.
- AbstractBlock Component
- Block Composite
- Client
We will build an Abstract block with Add and remove block features. If we want we can implement Add and Remove features explicitly. In my case I am using List, by default I will have Add, and Remove features available for adding/removing blocks.
Now implement Composite object; i.e., Block by implementing/inheriting component i.e. in our code AbstractBlock.
In the above code we can see that, we provided the implementation for the BuildBlock method. Based on our needs we can make concrete or non-concreate methods as well.
Below is the client class code.
In the above code, we can see that the client has utilized a composite object and built the first Smart City followed by Smart Layout.
- Smart Layout followed by Smart Home
- Smart Home followed by Smart Room
- Smart Room followed by Smart Locker
- Smart Locker followed by Smart Folder
- Smart Folder followed by Smart File
After executing this code we can see the same hierarchy in JSON format. For easy understating, I Serialized the object into JSON. Below is the output.
![Output]()
When we have a requirement of implementing some nested objects with the same type then we can go for this design pattern.
We can extend this composite object to any extent with N number of blocks inside blocks.
Summary
Above is a simple example of using a composite design pattern, you can download the uploaded source code and try adding more blocks. I hope it helps.