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クラスでラップすることによりデコレートすることが出来ます。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント