It is best used for extending objects behavior at runtime without breaking existing code by just injecting objects.
Able to combine multiple decorator by wrapping or injecting them.
Open/Closed Principle since your not modifying the parent object instead your extending by creating another object and inject them.
Single Responsibility since your working on its own functionality on each decorator.