Pattern-Oriented Analysis and Design: Composing Patterns to Design Software Systems