JavaのデザインパターンDecorator

JavaのデザインパターンDecorator

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

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

メリット

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

既存クラス

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

package jp.co.confrage.decorator;
public class Coffee {
public int price() {
return 350;
}
}

view raw
Coffee.java
hosted with ❤ by GitHub

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();
}

view raw
Decorator.java
hosted with ❤ by GitHub

装飾するクラスは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円とする
}
}

view raw
Milk.java
hosted with ❤ by GitHub

呼び出し側

呼び出す側は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
}
}

view raw
DecoratorSample.java
hosted with ❤ by GitHub

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

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA