Decoratorパターン - TypeScriptでの動的な振る舞い拡張
オブジェクトに動的に振る舞いを追加するDecoratorパターンを学びましょう。ロギング、キャッシング、認証、ミドルウェアチェーンのTypeScript実装例。
Structural
詳細な説明
Decoratorパターン
Decoratorパターンは、オブジェクトに動的に追加の責任を付与します。デコレータレイヤーでオブジェクトをラップすることにより、機能を拡張するためのサブクラス化の柔軟な代替手段を提供します。
ラッパーの概念
各デコレータは、ラップするオブジェクトと同じインターフェースを持ちます。ラップされたオブジェクトに呼び出しを委譲し、前後に振る舞いを追加します。
デコレータのスタック
パターンの力はスタッキングにあります。暗号化と圧縮の両方を透過的に適用できます。順序が重要で、暗号化してから圧縮するのと、圧縮してから暗号化するのでは異なる結果になります。
継承との比較
継承は静的でクラス全体に適用されます。デコレータは動的で、実行時に個々のオブジェクトに適用されます。振る舞いを「継承解除」することはできませんが、オブジェクトをラップしないことは選択できます。
実世界の例
- Express/Koaミドルウェア: 各ミドルウェアが次のミドルウェアをラップし、ロギング、認証、圧縮などを追加
- React Higher-Order Components:
withAuth(withTheme(MyComponent))はまさにDecoratorパターン - Java I/O Streams: Decoratorパターンの教科書的な例
Decoratorを選ぶべき場面
クラスの爆発なしに実行時に振る舞いを組み合わせる必要がある場合にDecoratorを使用しましょう。3つの機能(A, B, C)を組み合わせる場合、継承では8つのサブクラスが必要ですが、デコレータなら3つのラッパークラスだけで済みます。
ユースケース
Decoratorは、ミドルウェアパイプライン(HTTPリクエスト処理)、ロギングおよび監視ラッパー、データアクセスオブジェクトをラップするキャッシュレイヤー、入力バリデーションチェーン、React Higher-Order Componentsやrender propsによるコンポーネント拡張に不可欠です。