Design patterns for developing dynamically adaptive systems