Benefits:
• It provides greater flexibility than static inheritance.
• It avoids the need to place feature-laden classes higher up the hierarchy.
• It simplifies coding by allowing you to develop a series of functionalitytargeted classes, instead of coding all of the behavior into the object.
• It enhances the extensibility of the object, because changes are made by coding new classes.
Applicable Scenarios:
• You want to transparently and dynamically add responsibilities to objects without affecting other objects.
• You want to add responsibilities to an object that you may want to change in the future.
• Extending functionality by subclassing is no longer practical.