装饰者(Decorator)
从名字上看“装饰”,就是让被装饰者更加丰富,即为对象动态添加功能。
Definition
为对象动态的添加功能,使用装饰者模式生成子类的方法让功能的拓展变得更灵活。
设计的初衷:回想一下在我们以前的学习中如何去拓展一个功能,答案是:继承。但是当需要扩展的子类很多的时候,继承就会变得十分复杂。
Implementation
同样用Iphone11和12来做例子。 购买Iphone12不会赠送充电器,然而以前都是会附带有充电器的,这时候厂商就有必要支持动态添加随机赠送配件(这是继承实现不了的)。可以支持搭配优惠配件,每增加一种配件,订单价格就会增加。
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