Dynamic Upgrades with the Decorator Pattern
In the last chapter, we built a flexible system for saving data snapshots at different moments in our program’s lifecycle. In this chapter, we’ll move away from data and back to behavior with the Decorator pattern, which lets us dynamically add new behaviors to existing objects without using traditional subclassing techniques.
Adding responsibilities and behaviors to classes that already exist can be a somewhat prickly decision, especially in object-oriented programming. Inheritance and subclassing are valid solutions when you’re attacking this problem, but they can get bloated and aren’t the most flexible. I say “not the most flexible” because customizing subclass hierarchies can be quite static; or, if you’re feeling brave, you code in a bunch of default subclass properties that give the appearance of flexibility, but really, they’re just a maintenance headache waiting to strike...