ホームページ  >  記事  >  Java  >  Javaのデコレータパターン例を詳しく解説

Javaのデコレータパターン例を詳しく解説

黄舟
黄舟オリジナル
2017-09-05 10:27:311521ブラウズ

この記事では主に Java デコレータ パターンを紹介し、デコレータ パターンの原理と Java 固有の実装テクニックをサンプルの形で詳しく分析します。必要な方は参考にしてください。

この記事では Java デコレータ パターンを例とともに説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

装飾モード

元のクラスファイルを変更せず、継承を使用せずにオブジェクトの機能を動的に拡張します。ラッピングオブジェクト、つまり装飾を作成することで、実際のオブジェクトをラッピングします。

装飾されたオブジェクトはクライアントからのすべてのリクエストを受け入れます。これらのリクエストを実際のオブジェクトに転送します。装飾されたオブジェクトは、これらのリクエストの転送前または転送後に追加の機能を追加できます。

これにより、特定のオブジェクトの構造を変更することなく、追加の機能を実行時に外部から追加できるようになります。オブジェクト指向設計では、通常、特定のクラスの機能拡張は継承を通じて実装されます。

利点

1. Decorator モードと継承関係の目的はオブジェクトの機能を拡張することですが、Decorator モードは継承よりも高い柔軟性を提供できます。

2. さまざまな特定の装飾クラスと、これらの装飾クラスの配置と組み合わせを使用することで、デザイナーはさまざまな動作の多くの組み合わせを作成できます。

ロール

デコレーションモードのさまざまなロールは次のとおりです:

(1) 抽象コンポーネント (コンポーネント) ロール: 追加の責任を受け取る準備ができているオブジェクトを標準化するための抽象インターフェイスを提供します。
(2) 具体的なコンポーネントの役割: 追加の責任を受け取るクラスを定義します。
(3) Decorator ロール: コンポーネント オブジェクトのインスタンスを保持し、抽象コンポーネント インターフェイスと一致するインターフェイスを実装します。
(4) コンクリート デコレーターの役割: コンポーネント オブジェクトに追加の責任を追加する責任があります。

サンプルコード

ハンドケーキにはさまざまな味がありますが、これに基づいて、卵、牛肉、テンダーロインを追加することができます。または肉などの組み合わせ。

抽象コンポーネントの役割


package 装饰者模式;
/**
 * 抽象类接口,规范饼的属性
 * @author oooo
 *
 */
public interface Cake {
//两个属性
  public String descripestion();
//属性描述
  public Double money();
//价格描述
}

具体的なコンポーネントの役割


package 装饰者模式;
/**
 * 原味手抓饼类
 * @author oooo
 *负责接收附加属性的类
 */
public class shreddedcake implements Cake{
//实现Cake接口
  @Override
  public String descripestion() {
    //描述属性
    return "原味手抓饼";
  }
  @Override
  public Double money() {
     //描述价格
    return 3.5;
  }
}

デコレータの役割


package 装饰者模式;
/**
 * 建立和饼的连接,得到原始饼的属性,添加属性的中介。
 * @author oooo
 *
 */
public abstract class Deractor implements Cake{
  Cake cake;
  public Deractor(Cake cake) {
    this.cake=cake;
  }
  public String descripestion(){
    return cake.descripestion();
  }
  public Double money(){
    return cake.money();
  }
}

具体的なデコレータの役割


package 装饰者模式;
/**
 * 鸡蛋手抓饼类
 * @author oooo
 *添加鸡蛋属性
 */
public class EggshrededCake extends Deractor{
  public EggshrededCake(Cake cake) {
    super(cake);
  }
  public String descripestion() {
    return "鸡蛋"+cake.descripestion();
  }
  @Override
  public Double money() {
    return 3.5+1.5;
  }
}

コンクリートデコレーターの役割


package 装饰者模式;
/**
 * 牛肉味手抓饼
 * @author oooo
 *添加牛肉属性
 */
public class beffshredded extends Deractor{
  public beffshredded(Cake cake) {
    super(cake);
    // TODO Auto-generated constructor stub
  }
  public String descripestion() {
    return "牛肉"+cake.descripestion();
  }
  @Override
  public Double money() {
    return cake.money()+3.0;
  }
}

テストクラス


package 装饰者模式;
public class Test {
  /**
   * 测试类
   * @param args
   */
  public static void main(String[] args) {
    //新建一个原味手抓饼类
    shreddedcake sh=new shreddedcake();
    System.out.println(sh.descripestion());
    System.out.print("  价格: "+sh.money());
    //新建一个鸡蛋类,附加鸡蛋属性到手抓饼上
    EggshrededCake egg=new EggshrededCake(sh);
    System.out.println(egg.descripestion());
    System.out.print("  价格:"+egg.money());
    //新建一个牛肉类,附加牛肉属性到手抓饼上
    beffshredded beff=new beffshredded(egg);
    System.out.println(beff.descripestion());
    System.out.print("  价格:"+beff.money());
  }
}

出力結果:


原味手抓饼  价格: 3.5
鸡蛋原味手抓饼  价格:5.0
牛肉鸡蛋原味手抓饼  价格:8.0

以上がJavaのデコレータパターン例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。