strategy pattern
strategy pattern