ウォーロックの言うとおり、デコレーターはダイナミックな価格設定に対応する方法です。多くのサービス (ここでのサービスは BLL クラスと見なされます) が必要になりますが、ビジネス ニーズに一致するため、それほど多くはありません。
必要なのは、2 つのインターフェース、1 つの汎用サービス インターフェース、および 1 つの価格設定ベース インターフェースです。C# の場合:
interface IBillParameter{
decimal DefaultCost { get; } // this is assumed if you has default fixed cost, but may be ignored
}
interface IBillCalculator<T> where T : IBillParameter{
decimal Calculate(T parameter);
}
次のような実装CarServices
:
class CarServiceBillParameter :IBillParameter {
decimal DefaultCost { get{ return 0; } } // for example if does not has any fixed cost
SizeF CarSize { get;set; }
int Seat { get;set; }
}
class CarFixedCostBillCalculator : IBillCalculator<CarServiceBillParameter>{
decimal Calculate(CarServiceBillParameter parameter){
return parameter.DefaultCost; // this can be replaced by database call, or zero for null pattern
}
}
class SeatCarServiceBillCalculator : IBillCalculator<CarServiceBillParameter>{
public SeatCarServiceBillCalculator(IBillCalculator<CarServiceBillParameter> baseCalculator){
this.baseCalculator = baseCalculator;
}
IBillCalculator<CarServiceBillParameter> baseCalculator;
decimal Calculate(CarServiceBillParameter parameter){
decimal eachSeatPrice = GetFromDatabase();
return parameter.Seat * eachSeatPrice + baseCalculator.Calculate(parameter);
}
}
このように、さらにロジックを追加する必要がある場合は、新しいクラスを導入するだけで済みます。たとえば、タイヤの数によって価格が異なるなどです。