使用抽象类而不是策略设计模式中的接口

时间:2014-08-02 19:41:05

标签: java oop inheritance design-patterns interface

我只是在学习Java和设计模式,而我正试图了解何时使用接口和抽象类。我想知道在策略设计模式中,为什么最好使用行为/算法子类的接口而不是抽象的超类?

是否只是因为不需要抽象类,因为每个行为/算法子类都有自己的实现,因此抽象超类只提供不会使用的额外功能?

如果需要,抽象类不会意味着将来可能会额外使用此额外功能,例如向抽象超类添加一个方法,如果需要,该方法由行为/算法子类共享。有什么理由说这是个坏主意吗?

或者还有其他原因吗?

4 个答案:

答案 0 :(得分:4)

您应该为所有策略使用通用接口,并创建实现它的抽象类。因此,尽管您的所有策略目前都共享一个抽象类,但您的系统是可扩展的,因为您可以在将来为此抽象类创建不相关的策略。

现在只使用超类的一些方法是你应该做出的决定。这可能是值得的。

note ::如果您使用类似于模板方法模式的内容,则应检查如何使用钩子。

答案 1 :(得分:1)

在Java 8之前,接口有一个大问题:在不破坏该接口的每个实现的情况下,无法添加其他功能(即添加新方法)。抽象基类是避免这个问题的一种方法。

Java 8引入了default methods,主要解决了这个问题。因此,使用现代Java系统,接口提供了更大的灵活性,而没有缺点。

答案 2 :(得分:1)

从实现的角度来看,您可以同时使用接口和抽象类。不同之处在于使用目的。

  • 接口的主要目的是为其他类提供方法(即通信点)。即解耦依赖的反转
  • 抽象类的主要目的是帮助您在它们上构建继承结构。

在策略模式中,如果您使用 AbstractState 来定义公共代码库,您仍然可以在 Context <之间放置 IState 接口/ em>和 AbstractState 将它们分离得更多。

答案 3 :(得分:0)

使用界面或抽象模式之间没有硬性规则。在您的情况下使用最好的。

如果您有多个非常相似的策略实现,您当然可以使用抽象类,甚至可以将其中一个策略子类化。