Basic software integration patterns explained