strategy pattern
strategy pattern implement