template method
strategy