Toshio Blog

Docorator Pattern Code

September 04, 2018

前回の記事、を読み直して、Decoratorパターンの復習をする。

docoratorパターンとは

自分の言葉で

あるクラスに機能を追加する方法として、継承で実現するのではなく、合成(委譲)で機能を実現する方法である。また動的に機能の追加をすることが可能である。

より詳しく

http://zecl.hatenablog.com/entry/20070603/p1

クラス図(wikipediaより

wikipediaのサンプルコード

// 出所 https://ja.wikipedia.org/wiki/Decorator_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
/** 価格をあらわすインタフェース */
interface Price{
int getValue();
}
/** 原価を表すクラス */
class PrimePrice implements Price{
private int value;
PrimePrice(int value){
this.value = value;
}
public int getValue(){
return this.value;
}
}
/** マージンを介する価格 */
abstract class MarginPrice implements Price{
protected Price originalPrice;
MarginPrice(Price price){
this.originalPrice = price;
}
}
/** 設定された利益を仕入れ価格に上乗せする Price */
class WholesalePrice extends MarginPrice{
private int advantage;
WholesalePrice(Price price, int advantage){
super(price);
this.advantage = advantage;
}
public int getValue(){
return this.originalPrice.getValue() + advantage;
}
}
/** 仕入れ価格の 2 倍の値段を提示する Price */
class DoublePrice extends MarginPrice{
DoublePrice(Price price){
super(price);
}
public int getValue(){
return this.originalPrice.getValue() * 2;
}
}
public class DecoratorTest{
public static void main(String[] argv){
System.out.println(
new WholesalePrice(
new DoublePrice(
new WholesalePrice(
new DoublePrice(
new PrimePrice(120)
)
,80
)
)
,200
)
.getValue()
);
}
}

中心となるオブジェクトがあって、その役割を果たすのがConcreteComponentである。その中心となるオブジェクトに装飾する役割を果たすクラスがConcreteDecoratorである。

あとで読む: https://sourcemaking.com/design_patterns/decorator


Written by Ta Toshio who lives and works in Saitama, Japan .You should follow him on Twitter