Object-Oriented Software Engineering: Using UML, Patterns, JAVA