メインコンテンツまでスキップ

🔍 Decorator と Proxy の比較

✅ 比較の目的

DecoratorProxy は、どちらも 他のオブジェクトと同じインターフェースを持つクラスを用いて振る舞いを拡張または制御する パターンである。構造的にはよく似ているが、目的・適用タイミング・責務の持ち方に明確な違いがある。本節では、その違いと使い分けの判断軸を整理する。

以下は、Decorator vs Proxy の比較表(日本語版)です。

✅ 比較の観点

比較項目Decorator(デコレーター)Proxy(プロキシ)
目的機能追加・動的な振る舞いの拡張アクセス制御・キャッシュ・遅延処理などの制御
構造同じインターフェースを持ち、処理を包み込む同じインターフェースを持ち、アクセスを仲介
主な用途ログ追加・認可チェック・UI 構成の動的変更などキャッシュ・認証・リモート呼び出しなど
オブジェクト生成明示的にラップして機能を追加内部的に RealSubject をラップ
実行制御振る舞いの拡張が主目的振る舞いの制御・監視が主目的
実行タイミング処理の前後に挿入されることが多い処理の前にチェックや条件判定を入れる
利用シーン機能を追加したいとき(UI やログなど)実体を守りたいとき(認証・キャッシュなど)

✅ 類似点

  • 共通のインターフェースを持つクラスをラップする構造
  • オブジェクトの前後処理や条件付き処理を追加可能
  • クライアントコードから見ると、どちらも同じインターフェースで利用できる

✅ 決定的な違い

観点DecoratorProxy
目的機能の追加・装飾アクセス制御・遅延初期化・監視など
責務の主軸元の処理に追加の機能を与える本体への制御されたアクセスを提供
使用タイミング追加処理を重ねていきたい時本体の生成を遅らせたい/アクセスを監視したい時
実行主体実際の処理は常に本体(元のクラス)に委譲条件に応じて処理を実行しないこともある

✅ 選び分けの判断軸

  • 機能追加・拡張を目的とするDecorator
  • アクセス制御・条件付き実行を目的とするProxy
  • 複数の装飾処理を重ねたいDecorator
  • ログ・認証・キャッシュ制御を挟みたいProxy

✅ UML クラス図

Decorator パターン

Proxy パターン

✅ 実務でのヒント

  • Decorator は機能の「足し算」が得意で、ログ出力や表示装飾などの 段階的な追加 に適している。
  • Proxy は条件分岐・制御の「フィルター」として機能し、認証やキャッシュなどの 実行制御 に向いている。
  • ▶️ 例:画面に表示するコンポーネントに対して複数の装飾を施す場合は Decorator、API アクセスにログや認証を加えたい場合は Proxy が有効。

✅ まとめ

  • Decorator処理の追加・拡張 による振る舞いの変化を目的とする
  • Proxy制御や遅延評価 を通じてアクセス方法を最適化する構造
  • どちらもラップ構造を持つが、「主目的」がまったく異なる
  • ユースケースと責務の主軸に応じて、明確に使い分けるべきパターンである