Decorator
トッピングを重ねて拡張
機能を重ねて拡張する
このデモで分かること: トッピングを好きなだけ重ねて拡張する
このデモで Decorator を使う理由
- ベース(エスプレッソ)に、トッピングを任意の組み合わせで足したい。
- 組み合わせごとにサブクラスを作ると、トッピングの数だけクラス爆発する。
- Decorator なら「1 トッピング = 1 ラップ」で、好きなだけ重ねて価格と説明を足せる。
パターンなし vs このパターン(イメージ)
記事の本編ではなく、このデモ題材を if の山にした場合との対比です(疑似コード)。
パターンなし
// パターンなし(イメージ)
class EspressoWithMilkAndWhip { ... }
class EspressoWithMilkAndSyrup { ... }
// → 組み合わせの数だけクラスが必要
Decorator あり
// Decorator Beverage b = new Espresso(); b = new MilkDecorator(b); b = new WhipDecorator(b); // → 重ねるだけで組み合わせ自由
デモ
ベースはエスプレッソ(300円)。トッピングを重ねるたびに Decorator が1枚増えます。
結果
エスプレッソ
300 円
このデモで使っている主な型
Espresso · *Decorator
トッピングの数だけ Decorator がラップされます。
操作 → 動いたクラス / メソッド
- 操作: ベース Espresso にトッピングを重ねる
- → new Espresso()
- → beverage.description() / cost() … 外側から内側へ委譲
このパターンの解説記事 ↗
記事は考え方・別サンプルの解説です。このページのデモ実装とはソースが異なります (クラス名・題材はデモ用に簡略化しています)。