Design Patterns Explained: A New Perspective on Object-Oriented Design (2nd Edition)