25-Comp-B11 Advanced Software Design · December 2019
Question 16 of 28: Decorator vs. Strategy
Nivaar worked solution (AI-drafted; not reviewed by a licensed engineer)
Notes on this paper
17-Comp-B11 Advanced Software Design — National Exams, December 2019. 3 hours, closed book exam with one aid sheet allowed (written on both sides), no calculator permitted. The paper is organized into five parts, and candidates were instructed to answer any five (5) questions in Part I, any three (3) in Part II, any four (4) in Part III, any two (2) in Part IV, and any five (5) in Part V — only the first questions answered, in each part, as they appear in the answer book are marked. All questions carry equal weight, so the 19 questions actually marked (5+3+4+2+5 of 28) each count for 100/19 ≈ 5.26% of the paper. All 28 questions are answered below for completeness.
Reference texts: Sommerville, Software Engineering (10th ed., Pearson) — software processes, requirements engineering, design principles, testing, dependability; Pressman, Software Engineering: A Practitioner's Approach (9th ed.) — supplementary process and quality coverage; Gamma, Helm, Johnson & Vlissides (GoF), Design Patterns: Elements of Reusable Object-Oriented Software — creational/structural/behavioural pattern catalogue and the "program to an interface, not an implementation" / "favor object composition over class inheritance" principles; Sebesta, Concepts of Programming Languages (12th ed.) — polymorphism, dynamic binding, visibility, and multiple inheritance semantics; Bertrand Meyer, Object-Oriented Software Construction — design by contract, preconditions/postconditions/class invariants; Barbara Liskov's 1987 substitutability paper for Question 12; Karl Wiegers, Software Requirements (3rd ed.); Myers, The Art of Software Testing, for Question 6.
Decorator (structural) dynamically ADDS responsibilities to an individual object by wrapping it in one or more decorator objects that implement the same interface as the wrapped object and forward to it, adding behaviour before/after the forwarded call. Example: a Coffee object wrapped in a MilkDecorator, then further wrapped in a SugarDecorator — each layer adds its own cost and description on top of what it wraps, and any number of decorators can be stacked.
Strategy (behavioural) defines a FAMILY of interchangeable algorithms, encapsulates each one behind a common interface, and lets a context object hold and swap exactly ONE strategy at a time to change HOW a single operation is performed. Example: a Sorter context holds a SortStrategy reference; swapping in QuickSortStrategy or MergeSortStrategy changes how sort() is carried out, with no change to Sorter's own code.
The difference. Decorator's intent is ADDITIVE: it layers extra responsibilities onto an object, and several decorators can stack to cumulatively change what an object does. Strategy's intent is SUBSTITUTIVE: it replaces one algorithm wholesale with another, and a context holds exactly one strategy at a time — there is no notion of "stacking" two strategies. Both use composition and delegate to an object sharing a common interface (their structural resemblance is why they are easy to confuse), but Decorator changes WHAT a wrapped object does by adding to it, while Strategy changes HOW one operation is carried out by swapping the whole implementation.