added Strategy Pattern