use Iterator, Composite, Observer, Decorator and Template Method Pattern