简介
装饰者模式可以动态地给对象添加一些额外的属性或行为。相比于使用继承,装饰者模式更加灵活。
实现
项目场景:现在有一个拼车计费规则:3公里以内起步价13元;3公里以上2.3元/公里;燃油附加费1次收取1元,此时可以用装饰者模式来实现最终路程所需的价钱。
首先,我们需要定义一个抽象组件,它是一个接口,用来装饰拼车规范。
public interface Valuation {
float calculation(float km);
}
接下来定义被装饰者基类,3公里以内起步价13元。
public class BasicValuation implements Valuation {
private Valuation valuation;
public BasicValuation(Valuation valuation){
this.valuation = valuation;
}
@Override
public float calculation(float km) {
return 13;
}
}
然后定义装饰者组件,3公里以上2.3元/公里。
public class StartPriceValuation implements Valuation {
private Valuation valuation;
public StartPriceValuation(Valuation valuation) {
this.valuation = valuation;
}
@Override
public float calculation(float km) {
float t = km - 3;
if(t >= 0)
return 2.3f * t + valuation.calculation(km);
return valuation.calculation(km);
}
}
燃油附加费1次收取1元。
public class FuelCostValuation implements Valuation {
private Valuation valuation;
public FuelCostValuation(Valuation valuation) {
this.valuation = valuation;
}
@Override
public float calculation(float km) {
return valuation.calculation(km)+1;
}
}
客户端代码
public class Shop {
public static void main(String[] args) {
float Distance = 6;
Valuation valuation = new
FuelCostValuation(new StartPriceValuation(new BasicValuation(null)));
float calculation = valuation.calculation(Distance);
System.out.println(calculation);
// 13 + (6-3)*2.3 + 1;
}
}
生成结果