Composite Design Pattern in C++
Composite design pattern
- Identify the scalar/primitive classes and vector/container classes
- Create an "interface" (lowest common denominator) that can make all concrete classes "interchangeable"
- All concrete classes declare an "is a" relationship to the interface
- All "container" classes couple themselves to the interface (recursive composition, Composite "has a" set of children up the "is a" hierarchy)
- "Container" classes use polymorphism as they delegate to their children
#include <iostream> #include <vector> using namespace std; // 2. Create an "interface" (lowest common denominator) class Component { public: virtual void traverse() = 0; }; class Leaf: public Component { // 1. Scalar class 3. "isa" relationship int value; public: Leaf(int val) { value = val; } void traverse() { cout << value << ' '; } }; class Composite: public Component { // 1. Vector class 3. "isa" relationship vector < Component * > children; // 4. "container" coupled to the interface public: // 4. "container" class coupled to the interface void add(Component *ele) { children.push_back(ele); } void traverse() { for (int i = 0; i < children.size(); i++) // 5. Use polymorphism to delegate to children children[i]->traverse(); } }; int main() { Composite containers[4]; for (int i = 0; i < 4; i++) for (int j = 0; j < 3; j++) containers[i].add(new Leaf(i *3+j)); for (i = 1; i < 4; i++) containers[0].add(&(containers[i])); for (i = 0; i < 4; i++) { containers[i].traverse(); cout << endl; } } Output
0 1 2 3 4 5 6 7 8 9 10 11 3 4 5 6 7 8 9 10 11
