Design Patterns - the basis for reusable object-oriented software