デコレーター パターンは、既存のオブジェクトを変更せずに、オブジェクトに新しい動作と責任を動的に追加できる構造設計パターンです。このパターンは、オブジェクトをデコレータ オブジェクトでラップすることで結合することで機能強化を実現します。
原理の説明:
デコレーション モードは、装飾されたオブジェクトと同じインターフェイスを実装し、装飾されたオブジェクトへの参照を保持するデコレーター クラスを作成します。デコレータ クラスは、装飾されたオブジェクトのメソッドを呼び出す前または後に追加の動作を実行することにより、装飾されたオブジェクトの機能を拡張します。このアプローチにより、実行時にオブジェクトの機能を動的に追加、削除、または変更することが可能になります。
基礎となる構造図:
以下は、装飾モードの古典的な構造図です。
+------------------+
| Component |
+------------------+
| operation() |
+------------------+
/ \
/ \
+----------------+ +----------------+
| Concrete | | Concrete |
| Component | | Component |
+----------------+ +----------------+
| operation() | | operation() |
+----------------+ +----------------+
/ \
/ \
+----------------+ +----------------+
| Decorator | | Decorator |
+----------------+ +----------------+
| component | | component |
+----------------+ +----------------+
| operation() | | operation() |
+----------------+ +----------------+
上記の構造図では、Component
基本的な操作を定義する抽象クラスまたはインターフェイスです。Concrete Component
基本的な機能を提供する具象実装クラスです。Decorator
デコレータの抽象クラスであり、 Component
インターフェイスも実装し、 Component
オブジェクトへの参照を保持します。Concrete Decorator
デコレータの機能を拡張することで装飾オブジェクトを強化する具象デコレータ実装クラスです。
Go でデコレーター パターンを実装するコード例を次に示します。
package main
import "fmt"
// Component 接口定义了基本操作
type Component interface {
Operation()
}
// ConcreteComponent 是具体的组件实现
type ConcreteComponent struct{}
func (c *ConcreteComponent) Operation() {
fmt.Println("执行基本操作")
}
// Decorator 是装饰器抽象类
type Decorator interface {
Component
}
// ConcreteDecoratorA 是具体的装饰器实现类
type ConcreteDecoratorA struct {
component Component
}
func (d *ConcreteDecoratorA) Operation() {
fmt.Println("执行装饰器A的操作")
d.component.Operation()
}
// ConcreteDecoratorB 是具体的装饰器实现类
type ConcreteDecoratorB struct {
component Component
}
func (d *ConcreteDecoratorB) Operation() {
fmt.Println("执行装饰器B的操作")
d.component.Operation()
}
func main() {
// 创建具体组件对象
component := &ConcreteComponent{}
// 创建装饰器A,并将组件对象作为参数传入
decoratorA := &ConcreteDecoratorA{
component: component,
}
// 创建装饰器B,并将装饰器A作为参数传入
decoratorB := &ConcreteDecoratorB{
component: decoratorA,
}
// 调用装饰器B的操作
decoratorB.Operation()
}
上記のコードでは、Component
基本的な操作を定義するインターフェイスであり、ConcreteComponent
特定のコンポーネントの実装です。Decorator
デコレータ抽象クラスであり、 Component
インターフェイスの実装でもあります。ConcreteDecoratorA
および は 、オブジェクトへの参照をConcreteDecoratorB
保持し、アクションが呼び出されたときに追加の機能を実行する具体的なデコレータ実装クラスです 。Component
この関数では main
、まず具体的なコンポーネント オブジェクトを作成します component
。次に、デコレータが作成され decoratorA
、コンポーネント オブジェクトがパラメータとして渡されます。次に、デコレータを作成し 、 パラメータとしてdecoratorB
デコレータを渡します 。decoratorA
最後に、デコレータを呼び出す操作では、 decoratorB
実際にデコレータ チェーンの順序でデコレータの操作が実行され、最後に特定のコンポーネントの操作が実行されます。
出力は次のとおりです。
执行装饰器B的操作
执行装饰器A的操作
执行基本操作
ご覧のとおり、デコレータ パターンを使用すると、特定のコンポーネントを変更することなく、デコレータの組み合わせによって新しい機能を動的に追加できます。上記の例では、デコレータ A とデコレータ B はそれぞれ、特定のコンポーネントの元の機能に影響を与えることなく追加の操作を追加します。
使用シナリオの説明:
デコレーション モードは次のシナリオに適用されます。
- 既存のオブジェクトを変更せずに、機能または責任を動的に追加する必要がある場合。
- オブジェクトの複数のプロパティに機能を個別に追加する必要がある場合は、複数のデコレータを使用して組み合わせることができます。
- デコレータ パターンは、実行時にオブジェクトの機能を動的に追加、削除、または変更する必要がある場合に柔軟性を提供します。
ドキュメントのリンク:
Decorator パターンの詳細を学ぶためのドキュメントへのリンクをいくつか示します。
- 「デザイン パターン: 再利用可能なオブジェクト指向ソフトウェアの要素」 Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides 著 (GOF ブック)
- Head First デザイン パターン (Eric Freeman、Elisabeth Robson、Bert Bates、Kathy Sierra 著)
- デコレータ パターン - Java デザイン パターン (JournalDev)
- デコレーター パターン - リファクタリングの達人 (リファクタリングの達人)
現在デコレータ パターンを使用している製品:
デコレータ パターンは、ソフトウェア開発で広く使用されている一般的な設計パターンです。多くのオープン ソース ライブラリ、フレームワーク、アプリケーションはデコレータ パターンを使用します。現在デコレーター パターンを使用している製品の例をいくつか示します。
- Java IO クラス ライブラリの入力ストリームと出力ストリーム。
- Java AWT および Swing GUI コンポーネントのデコレータ クラス ( など )
JScrollPane
。JToolBar
- Web フレームワークのミドルウェア (Express.js のルーティング ミドルウェア、認証ミドルウェアなど)。
- 画像処理ソフトウェアのフィルター機能は、デコレーターモードを通じてさまざまなフィルター効果を動的に追加できます。
- ゲーム開発におけるキャラクター装備システムは、デコレータ モードを通じてキャラクターにさまざまな装備効果を動的に追加できます。