如果具有相同接口的类具有相似但不同的方法签名,该怎么办?

Mic*_* W. 6 java design-patterns interface

如果具有相同接口的类具有相似但不同的方法签名,该怎么办?

假设我有一个计算不同成本的项目(最终得到总成本).

在我的节目,有几个计算器类,即ACostCalculator,BCostCalculator等等.当calculate()调用方法来计算成本时,成本容器也会传递给这些成本计算器.在一个好的场景中,我可以CostCalculator为每个成本计算器创建一个接口.

但是,不同成本的计算需要不同的资源.在我目前的计划中,它是这样的:

//getResource() are costly method while several costs need this. So do it outside calculate() method.
ResourceA resourceA = getResourceA(); 
ResourceB resourceB = getResourceB();

CostContainer costContainer = new CostContainer();
CostCalculator aCostCalculator = new ACostCalculator();
...
CostCalculator eCostCalculator = new ECostCalculator();

aCostCalculator.calculate(costContainer);
bCostCalculator.calculate(costContainer)
cCostCalculator.calculate(costContainer, resourceA);
dCostCalculator.calculate(costContainer, resourceA);
eCostCalculator.calculate(costContainer, resourceA, resourceB);
Run Code Online (Sandbox Code Playgroud)

如果签名完全相同,我可以方便地做一个循环来立即执行.但是,由于它们相似但不同,我甚至无法建立良好的界面.

我不确定是否有好方法可以这样做.我能想到的是将所有calculate()方法概括为

calculate(CostContainer costContainer, List<Object> resources);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢回答.

les*_*ana 5

如果资源在计算器的生命周期内保持不变:将资源传递给计算器的构造函数.

ResourceA resourceA = getResourceA(); 
ResourceB resourceB = getResourceB();

CostContainer costContainer = new CostContainer();

CostCalculator aCostCalculator = new ACostCalculator();
CostCalculator bCostCalculator = new BCostCalculator();
CostCalculator cCostCalculator = new CCostCalculator(resourceA);
CostCalculator dCostCalculator = new DCostCalculator(resourceA);
CostCalculator eCostCalculator = new ECostCalculator(resourceA, resourceB);

aCostCalculator.calculate(costContainer);
bCostCalculator.calculate(costContainer);
cCostCalculator.calculate(costContainer);
dCostCalculator.calculate(costContainer);
eCostCalculator.calculate(costContainer);
Run Code Online (Sandbox Code Playgroud)

  • @lesmana 将 `CostContainer` 作为依赖项而不是将其传递给 `calculate` 方法在我看来是一个更好的选择。 (2认同)