デコレータパターンとは何ですか?
追加の責任をオブジェクトに動的に追加します。機能の追加という点では、Decorator パターンはサブクラスを生成するよりも柔軟です。
1. 構造
コンポーネント: これらのオブジェクトに責任を動的に追加できるオブジェクト インターフェイスを定義します。
interface Component { public void operation(); } ConcreteComponent : 实现 Component 定义的接口。 class ConcreteComponent implements Component { @Override public void operation() { System.out.println("初始行为"); } }
Decorator: Componentを継承し、Componentクラスの機能を外部クラスから拡張する装飾的な抽象クラスですが、Componentの場合はDecoratorの存在を知る必要はありません。
class Decorator implements Component { // 持有一个 Component 对象,和 Component 形成聚合关系 protected Component component; // 传入要进一步修饰的对象 public Decorator(Component component) { this.component = component; } @Override // 调用要修饰对象的原方法 public void operation() { component.operation(); } }
ConcreteDecorator: コンポーネントに責任を追加する機能を持つ特定の装飾オブジェクト。
class ConcreteDecoratorA extends Decorator { private String addedState = "新属性1"; public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); System.out.println("添加属性: " + addedState); } } class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public void operation() { super.operation(); AddedBehavior(); } public void AddedBehavior() { System.out.println("添加行为"); } }
テストコード
public class DecoratorPattern { public static void main(String[] args) { Component component = new ConcreteComponent(); component.operation(); System.out.println("======================================"); Decorator decoratorA = new ConcreteDecoratorA(component); decoratorA.operation(); System.out.println("======================================"); Decorator decoratorB = new ConcreteDecoratorB(decoratorA); decoratorB.operation(); } }
実行結果
初始行为 ====================================== 初始行为 添加属性: 新属性1 ====================================== 初始行为 添加属性: 新属性1 添加行为
2. アプリケーションシナリオ
1. オブジェクトに責任を動的かつ透過的に追加する必要があります。影響を与えずに他のオブジェクト。
2. 関数はオブジェクトに動的に追加する必要があり、これらの関数は動的に取り消すことができます。
3. いくつかの基本関数の順列と組み合わせによって生成される非常に多くの関数を追加する必要があり、継承関係が非現実的になります。
4. サブクラスの生成方法が展開できない場合。場合によっては、多数の独立した拡張機能があり、それぞれの組み合わせをサポートするために多数のサブクラスが生成され、サブクラスの数が爆発的に増加することがあります。別のケースとしては、クラス定義が非表示になっているか、クラス定義を使用してサブクラスを生成できないことが考えられます。
3. 重要なポイント
1. 装飾されたオブジェクトと実際のオブジェクトは同じインターフェイスを持ちます。このようにして、クライアント オブジェクトは、実際のオブジェクトと同じ方法で装飾されたオブジェクトと対話できます。
2. 装飾オブジェクトには実際のオブジェクトへの参照が含まれています。
3. 装飾オブジェクトはクライアントからのすべてのリクエストを受け入れます。これらのリクエストを実際のオブジェクトに転送します。
4. 装飾オブジェクトは、これらのリクエストを転送する前または後に、いくつかの追加機能を追加できます。これにより、特定のオブジェクトの構造を変更することなく、実行時に追加の機能を外部から追加できるようになります。オブジェクト指向設計では、通常、特定のクラスの機能拡張は継承を通じて実装されます。
上記は Java デコレータ パターンの紹介です。皆さんの学習に役立つことを願っています。
Java デザイン パターン シリーズのデコレータ パターンに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。