クラスの動作は継承されるべきではなく、代わりにインターフェースを使用してカプセル化されるべきです。
つまり、Inventory
考えられるすべての税計算についてアイテムをサブクラス化するのではなく、インターフェイスの背後で計算アルゴリズムをカプセル化してInventory
から、正しいStrategyオブジェクトを指すクラス内でカプセル化を使用する必要があります。
Inventory
これにより、新しい計算を行うたびに新しいサブクラスを宣言する必要がなくなるため、多くの作業を節約できます。
次の実装は継承を使用します。
abstract class InventoryBase
{
protected abstract Money CalculateTax();
}
class InventoryTaxA : InventoryBase
{
protected override Money CalculateTax()
{
// Calculation A
}
}
class InventoryTaxB : InventoryBase
{
protected override Money CalculateTax()
{
// Calculation B
}
}
しかし、戦略パターンは次のようになります。
class Inventory
{
public Inventory(ITaxCalculationStrategy taxCalculationStrategy)
{
TaxCalculationStrategy = taxCalculationStrategy;
}
protected override Money CalculateTax()
{
return TaxCalculationStrategy.Calculate(this);
}
}
したがって、戦略は、税計算を抽象化するための優れたソリューションです。特定の時間に適用される計算のルールが異なり、変更される可能性がある場合は、ファクトリを使用して正しいStrategyオブジェクトを作成します。