たぶん、責任の連鎖パターンを探していますか?
ボーナスを計算する必要があり、このようなものを使用するとしましょう
public double GetBonusRate(int workingDays, int numberOfSales)
{
if(numberOfSales > 20)
{
return 1.5;
}
if(workingDays >= 20 && numberOfSales > 10)
{
return 1.2;
}
if(numberOfSales > 5)
{
return 1.0;
}
if(workingDays > 10)
{
return 0.1;
}
return 0;
}
条件の数が増えると予想し、間違った場所に新しい条件を追加するとバグが発生することに気付きます。
責任の連鎖は、別のアプローチを提供します。
var chain = new PerfectBonusRate();
chain.RegisterNext(new GoodBonusRate())
.RegisterNext(new StandartBonusRate())
.RegisterNext(new LazyBonusRate())
.RegisterNext(new NoBonusRate());
var bonusRate = chain.GetBonusRate(10, 20);
実装
abstract class ChainElement
{
ChainElement _next;
public ChainElement RegisterNext(ChainElement next)
{
_next = next;
return next;
}
public double GetBonusRate(int workingDays, int numberOfSales)
{
if(IsMatched(workingDays, numberOfSales))
{
return GetBonusValue();
}
return _next.GetBonusRate(workingDays, numberOfSales);
}
protected abstract bool IsMatched(int workingDays, int numberOfSales);
protected abstract int GetBonusValue();
}
class PerfectBonusRate : ChainElement
{
protected override bool IsMatched(int workingDays, int numberOfSales)
{
return numberOfSales > 20;
}
protected override double GetBonusValue()
{
return 1.5;
}
}
class GoodBonusRate : ChainElement
{
protected override bool IsMatched(int workingDays, int numberOfSales)
{
return workingDays >= 20 && numberOfSales > 10;
}
protected override double GetBonusValue()
{
return 1.2;
}
}
//and the same for StandartBonusRate, LazyBonusRate...
class NoBonusRate : ChainElement
{
protected override bool IsMatched(int workingDays, int numberOfSales)
{
return true;
}
protected override double GetBonusValue()
{
return 0.0;
}
}