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 がラップされます。

操作 → 動いたクラス / メソッド

  1. 操作: ベース Espresso にトッピングを重ねる
  2. → new Espresso()
  3. → beverage.description() / cost() … 外側から内側へ委譲
このパターンの解説記事 ↗

記事は考え方・別サンプルの解説です。このページのデモ実装とはソースが異なります (クラス名・題材はデモ用に簡略化しています)。