Applying UML and Patterns: An Introduction To Object-Oriented Analysis and Design And Iterative Development - Craig Larman