我们有一个系统,用于向客户收取不同类型的费用。
有多种收费类型,每种收费类型包括不同的收费项目。
以下是我使用工厂方法提出的问题,这个问题是我需要能够根据费用类型将不同的参数传递给每个计算函数,我该如何实现呢?
//product abstract class
public abstract class ChargeItem
{
public abstract List<ChargeResults> Calculate();
}
//Concrete product classes
public class ChargeType1 : ChargeItem
{
public override List<ChargeResults> Calculate()
{
return new List<ChargeResults> { new ChargeResults { CustomerId = 1, ChargeTotal = 10} };
}
}
public class ChargeType2 : ChargeItem
{
public override List<ChargeResults> Calculate()
{
return new List<ChargeResults> { new ChargeResults { CustomerId = 2, ChargeTotal = 20} };
}
}
public class ChargeType3 : ChargeItem
{
public override List<ChargeResults> Calculate()
{
return new List<ChargeResults> { new ChargeResults { CustomerId = 3, ChargeTotal = 30} };
}
}
//Creator abstract class
public abstract class GeneralCustomerCharge
{
//default constructor invokes the factory class
protected GeneralCustomerCharge()
{
this.CreateCharges();
}
public List<ChargeItem> ChargeItems { get; protected set; }
public abstract void CreateCharges();
}
public class AssetCharges : GeneralCustomerCharge
{
public override void CreateCharges()
{
ChargeItems = new List<ChargeItem> { new ChargeType1(), new ChargeType2() };
}
}
public class SubscriptionCharges : GeneralCustomerCharge
{
public override void CreateCharges()
{
ChargeItems = new List<ChargeItem> { new ChargeType3() };
}
}
public class ChargeResults
{
public int CustomerId { get; set; }
public decimal ChargeTotal { get; set; }
}
用法是:
var newAssetCharge = new AssetCharges();
foreach (ChargeItem chargeItem in newAssetCharge.ChargeItems)
{
foreach (var item in chargeItem.Calculate())
{
Console.WriteLine("Asset Charges For Customer Id: {0}, Charge Total: {1}", item.CustomerId, item.ChargeTotal);
}
}
我需要能够从 foreach 循环中将不同类型的参数传递给chargeItem.Calculate(),具体取决于我调用的Calculate 方法,我该如何实现?
我计划为每种费用类型创建不同的费用类型参数类,然后确定费用类型并使用一些 if else 语句调用计算函数并传递相关参数类型,但我认为这不是一个好主意。有没有更好的方法来做到这一点,还是有另一种完全不同的方法来实现我在这里尝试做的事情?
谢谢