pattern strategy
patter template method
pattern visitor