Composite Pattern
Visitor Pattern