Designing Flexible Object-Oriented Systems with UML