Interface Oriented Design: With Patterns (Pragmatic Programmers)