Java デザイン パターン シリーズのデコレーター パターン

高洛峰
リリース: 2017-01-19 15:56:59
オリジナル
1018 人が閲覧しました

デコレータパターンとは何ですか?
追加の責任をオブジェクトに動的に追加します。機能の追加という点では、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 サイトに注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!