gpt4 book ai didi

java - 如何摆脱继承?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:21 25 4
gpt4 key购买 nike

我有一个算法,我有 2 个不同的算法实现。这些实现应该从很多地方调用,这取决于用户选择的模式。我不想在调用实现的所有地方都写条件语句。所以,我创建了一个抽象类,实现继承了它。我可以像这样在一个地方设置所需的模式:

if(firstMode){
list = new ListForm1();
}
else{
list = new LiastForm2();
}

然后在所有其他地方我可以享受多态性的所有好处。效果很好但是想去掉继承的原因如下:

  1. 我听说组合比继承好得多。
  2. 算法的第一种形式比第二种形式容易得多。在第一种形式中我只有 3 个方法,而在第二种形式中我有 15 个方法。抽象类必须包括所有 15 个(和 5 个通用方法)。事实证明,第一种形式没有使用12种方法。
  3. 理论上,该算法可能会出现一种新形式,与其他两种算法的共同点会更少,但会带来 10 个新方法,并且所有方法都必须添加一个抽象类。

据我了解,策略模式在这里使用没有意义。下面是策略模式的例子:

//abstract strategy
interface Strategy {
int execute(int a, int b);
}

// concrete strategy1
class ConcreteStrategyAdd implements Strategy {

public int execute(int a, int b) {
return a + b;
}
}

// concrete strategy2
class ConcreteStrategySubtract implements Strategy {

public int execute(int a, int b) {
return a - b;
}
}

//concrete strategy3
class ConcreteStrategyMultiply implements Strategy {

public int execute(int a, int b) {
return a * b;
}
}

class Context {

private Strategy strategy;

public Context() {
}

// Set new concrete strategy
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}

// use strategy
public int executeStrategy(int a, int b) {
return strategy.execute(a, b);
}
}

它有同样的问题。战略应该相互联系。如果我将它们与接口(interface)而不是抽象类链接起来,情况会更糟。接口(interface)将包含很多方法,但算法的第一种形式不需要其中许多方法。此外,一般方法必须在所有具体策略中重复。我无法在界面中提供默认实现。

此外,我不明白如何在这里使用组合。据我了解,Strategy Pattern 已经使用了组合。类 Context 包括 Strategy 的实例作为一个字段。但也许是委托(delegate)。

所以,这是我的问题:

可不可以把上面所有的问题都去掉(一个抽象类的方法太多,连接性强,很难添加新的算法形式),但仍然使用条件语句只在一个地方,而不是在所有情况下,当我需要某种形式的算法时。

更新:我想展示我是如何调用一些方法的,这些方法以第二种形式的算法实现,但不需要第一种形式的算法:

if (list.getCurrentLeaders().contains(ballIdx))

getCurrentLeaders() 方法的默认实现返回 null。所以,如果我用算法的第一种形式的实例调用它,那么我会得到一个错误。我知道这很糟糕。但是我该如何解决呢?

最佳答案

从一开始,如果您需要根据用户选择的不同模式调用不同的算法,您可以创建一种工厂类来在整个代码中提供算法。我认为,如果它只是一种算法,并且如果您使用的是 Java 8,则可以使用 Function。或 PredicateSupplier结合 map 来避免 if 语句,例如:

Map<String, Predicate<Whatever>> map = new HashMap<>();
map.put("mode_one", (w) -> true);
map.put("mode_two", (w) -> false);

然后调用算法,只需:

map.get("mode_one").test()

如果您需要像您发布的示例中那样提供不同的形式,您可以使用 Supplier 而不是 predicate。根据您的简单要求,我认为实现功能是最好的选择 ...

关于java - 如何摆脱继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36327130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com