add composite design pattern
add state design pattern