用很多方法实现接口=巨大的类。模式来拯救?

时间:2016-11-18 12:34:28

标签: java design-patterns interface

我有一个包含很多方法的界面。 (我不能分成不同的界面)

当我创建一个实现接口的类时,我在1个类文件中获得了很多方法。

当所有这些方法的主体变得更大时,事情变得更糟 - >类文件变得庞大而且难以导航。

即使是像eclipse一样的ide,因为包含所有类的Outline窗口都会得到一个垂直滚动条,因为并非所有方法都适合大纲。

是否有防止这种情况发生的模式?

6 个答案:

答案 0 :(得分:1)

没有办法在许多类中拆分实现。 但是您可以从实现类委托给任何其他类。 这将减少实现中的代码,但方法的数量保持不变。

答案 1 :(得分:1)

我不太明白为什么你不能将界面分成多个...

我肯定会尝试使用继承,例如:

第一个界面:

public interface FatherInterface {
    String methodOne(String var);

    String methodTwo(String var);

    String methodThree(String var);
}

第二界面:

public interface SonInterface extends FatherInterface {
    String methodFour(String var);

    String methodFive(String var);
}

第三界面:

public interface SecondSonInterface extends SonInterface {
    String methodSix(String var);

    String methodSeven(String var);
}

依此类推......每个接口都继承自前一个接口。

对于变大的类文件,也要继承。

父类:

public class Father implements FatherInterface

儿子班:

public class Son extends Father implements SonInterface

等等......

修改

如果你不能分割界面(就像第三方给出的那样),我会按部分来实现方法的实现。也就是说,每个类中只实现了其中一些。如果需要,使用抽象类(或留下空白方法)。每个类继承自上面的内容并实现其余一些方法。

答案 2 :(得分:1)

也许你可以通过从不同的类中实现一些方法来在大接口上使用策略模式。然后,当您希望使用任何这些方法时,只需从实现“大”接口的类中调用它。

有关策略模式的更多信息,请访问:https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm

答案 3 :(得分:1)

在这种情况下,我会考虑你班级中的所有方法是否设计得很好。可能他们没有明确的目的,应该按照少数人分开。 您必须定义某些特定接口的明确目的。

此外,如果您使用的是Java 8,请考虑为某些方法提供一些默认实现。

答案 4 :(得分:1)

我在接受答案后发布此回复,希望未来的人员可能会觉得它有用。

正如simas_ch所说:

  

没有办法在许多类中拆分实现。但   您可以从实现类委托给任何其他类。   这将减少实现中的代码但数量   方法保持不变。

一旦我在一个相当庞大的应用程序上工作,我必须定义一个Lifecycle接口,其中包含许多状态和许多可能造成麻烦的函数,所以我带来了类似的东西:

您可以创建一个类并使其抽象化并实现大多数常用功能。

public interface TheBigFunctional {
    public void functionalA();
    public void functionalB();
    public void functionalC();
    //....
    public void functionalZ();
}

public abstract class FunctionalBase implements TheBigFunctional {
    public void functionalA() {
        aInternal();
    }

    protected abstract void aInternal();

    // Rest of methods implementations.
    // You may choose to skip those if you want child classes to implement them.
}


public class FunctionalTypeFoo extends FunctionalBase {
    // Implementations.
}

public class FunctionalTypeBar extends FunctionalBase {
    // Implementations.
}

有许多(好的)方法来引用这个,但我正在分享我的所作所为。

答案 5 :(得分:0)

  

是否有一种模式可以防止这种情况的发生?

在Java中:

  • Subtyping:如果您可以将方法集分组到不同的接口中,那么明确的层次关系就很有意义。这就是公认的答案。
  • Interface Segregation:如果可以将方法集分组到不同的同级“域”或“类别”中。看一下this中的jcabi-github示例。看看Github是这个API的切入点,同时通过连续的“分组”接口公开不同的功能集。