デコレータ
名前から「装飾」を見ると、装飾された人を豊かにすること、つまりオブジェクトに動的に機能を追加することを意味します。
定義
オブジェクトに関数を動的に追加し、デコレータパターンを使用してサブクラスを生成し、関数の拡張をより柔軟にします。
設計の本来の意図:以前の学習で関数を拡張する方法を思い出してください。答えは継承です。しかし、拡張する必要のあるサブクラスが多数ある場合、継承は非常に複雑になります。
実装
また、例としてIphone11と12を使用します。Iphone 12には充電器は付属していませんが、現時点では常に充電器が付属しています。現時点では、メーカーがランダムギフトアクセサリの動的な追加をサポートする必要があります(これは継承では実現できません)。一致する優先アクセサリーをサポートでき、追加のアクセサリーごとに、注文価格が上昇します。
public interface Iphone {
double cost();
String name();
}
public class Iphone12 implements Iphone {
protected String name;
public Iphone12(){
name = "Iphone12";
}
@Override
public double cost() {
return 9000.0;
}
@Override
public String name() {
return name;
}
}
public class Iphone11 implements Iphone {
protected String name;
public Iphone11(){
name = "Iphone11";
}
@Override
public double cost() {
return 8000.0;
}
@Override
public String name() {
return name;
}
}
デコレータ
public abstract class Decorator implements Iphone {
public abstract double cost();
public abstract String name();
}
アップルウォッチ
public class Iwatch extends Decorator {
Iphone iphone;
public Iwatch(Iphone iphone){
this.iphone = iphone;
}
@Override
public String name() {
return iphone.name()+" 追加Iwatch";
}
@Override
public double cost() {
return iphone.getPrice()+1500.0;
}
}
充電器
public class Charger extends Decorator {
Iphone iphone;
public Charger(Iphone iphone){
this.iphone = iphone;
}
@Override
public String name() {
return iphone.name()+" 追加充电器";
}
@Override
public double cost() {
return iphone.cost()+0.0;//充电器免费
}
}
public class Client {
public static void main(String[] args) {
Iphone iphone12 = new Iphone12();
iphone12 = new Iwatch(iphone12);
Iphone iphone11 = new Iphone11();
iphone11 = new Charge(iphone11);
System.out.println(iphone12.name() +"。一共花费:"+ iphone12.cost());
System.out.println(iphone11.name() +"。一共花费:"+ iphone11.cost());
}
}
出力
Iphone12 追加Iwatch。一共花费:10500.0
Iphone11 追加充电器。一共花费:8000.0