add StrategyPattern