JavaのデザインパターンDecorator

JavaのデザインパターンDecorator

Decoratorパターンは、既存クラスに対してデコレート(装飾)していくデザインパターンです。

既存クラスありきで、その既存クラスを変更することなく、Decoratorクラスを作成していって既存クラスに対して装飾するデザインパターンがDecoratorパターンになります。

メリット

  • 既存クラスの修正が不要

既存クラス

Coffeeクラスがあるとします。priceメソッドで値段を返します。

package jp.co.confrage.decorator;

public class Coffee {

  public int price() {
    return 350;
  }
}

Decoratorクラス

Coffeeクラスを継承した抽象クラスDecoratorを作成します。Coffeeクラスを装飾するのがDecoratorなので、Coffeeクラスを継承します。

引数に具象クラスCoffeeのインスタンスを渡します。

package jp.co.confrage.decorator;

public abstract class Decorator extends Coffee {
  protected Coffee coffee;

  public Decorator(Coffee coffee) {
    this.coffee = coffee;
  }

  public abstract int price();
}

装飾するクラスはDecoratorを継承

コーヒーに対してミルクを追加します。

Milkクラスを作成してCoffeeクラスに対して装飾します。その際MilkクラスはDecoratorクラスを継承します。(要するにMilkクラスはDecorator)

ここではミルクは10円としています。

package jp.co.confrage.decorator;

public class Milk extends Decorator {

  public Milk(Coffee coffee) {
    super(coffee);
  }

  @Override
  public int price() {
    return coffee.price() + 10; // ミルクは+10円とする
  }
}

呼び出し側

呼び出す側はCoffeeクラスのインスタンスを生成し、Milkクラスでラップします。

package jp.co.confrage.decorator;

public class DecoratorSample {

  public static void main(String[] args) {
    Coffee coffee = new Coffee();

    coffee = new Milk(coffee); // ラップ

    System.out.println(coffee.price()); // 360
  }
}

これで既存クラスを修正せずにMilkクラスでラップすることによりデコレートすることが出来ます。

コメント

タイトルとURLをコピーしました