Adding options like milk, sugar or logging through subclasses explodes into one class per combination. Decorator wraps an object in another with the same interface, adding one behaviour per wrapper, and the wrappers stack freely. Use it for optional extras that combine at runtime, the way Java's I/O streams add buffering on top of a file stream. If the wrapper controls access (caching, permissions, lazy loading) rather than adding behaviour, call it a Proxy.