add Strategy Pattern
...