Functional Programming Techniques implemented with Object-Oriented Design Patterns