Oop 我可以使用继承而不是在策略模式中实现接口吗?

Oop 我可以使用继承而不是在策略模式中实现接口吗?,oop,design-patterns,Oop,Design Patterns,从图中可以看出,我可以使用继承而不是实现接口吗 我的意思是从“ConcreteStrategyA和ConcreteStrategyB实现策略接口”更改为“ConcreteStrategyA和ConcreteStrategyB扩展策略类” 它仍然工作正常还是有问题 如果它仍然运行良好,我的下一个问题是“为什么大多数人喜欢使用界面?”没有技术问题 然而,一个类只能扩展一个基类,但它可以实现多个接口。因此,如果您想,比方说,将来更改继承结构,那么如果您选择实现一个接口来代替它,就更容易了 没有技术问题

从图中可以看出,我可以使用继承而不是实现接口吗

我的意思是从“
ConcreteStrategyA
ConcreteStrategyB
实现
策略
接口”更改为“
ConcreteStrategyA
ConcreteStrategyB
扩展
策略
类”

它仍然工作正常还是有问题


如果它仍然运行良好,我的下一个问题是“为什么大多数人喜欢使用界面?”

没有技术问题


然而,一个类只能扩展一个基类,但它可以实现多个接口。因此,如果您想,比方说,将来更改继承结构,那么如果您选择实现一个接口来代替它,就更容易了

没有技术问题


然而,一个类只能扩展一个基类,但它可以实现多个接口。因此,如果您想,比方说,将来更改继承结构,那么如果您选择实现一个接口来代替它,就更容易了

从设计模式的角度来看,具体的策略需要实现(我指的是编写代码,而不是接口实现)一个策略上下文知道的公共契约。这是战略模式哲学的主要支柱。遵守公共契约是允许策略上下文替换基于某些运行时特性的具体策略的原因。这种模式思想就是我们在OOP术语中松散地称之为多态性的东西。 现在在Java中,您可以将他的多态策略作为接口或继承来实现。对于接口,您已经在问题本身中给出了示例。对于继承,只要契约在子类之间存在(类似于带有抽象契约的基本抽象类,子类实现抽象契约以提供具体的策略实现),您也可以在继承中实现策略模式

现在从面向对象的角度来考虑。因为OOP继承是子类从超类继承的东西。子类自动拥有并因此演示继承的泛型行为,但它可以选择使该行为更特定于自己的类型。因此,多个子类可以覆盖相同的行为,并使其中的一些行为更适合于它们的使用。但是当这个链变得太长或者子类试图继承逻辑上不适用于它们的行为时,这个链就变得难以管理


因此,与继承相比,使用接口实现策略模式更有意义。

从设计模式的角度来看,具体的策略需要实现(我指的是编写代码,而不是接口实现)一个策略上下文知道的公共契约。这是战略模式哲学的主要支柱。遵守公共契约是允许策略上下文替换基于某些运行时特性的具体策略的原因。这种模式思想就是我们在OOP术语中松散地称之为多态性的东西。 现在在Java中,您可以将他的多态策略作为接口或继承来实现。对于接口,您已经在问题本身中给出了示例。对于继承,只要契约在子类之间存在(类似于带有抽象契约的基本抽象类,子类实现抽象契约以提供具体的策略实现),您也可以在继承中实现策略模式

现在从面向对象的角度来考虑。因为OOP继承是子类从超类继承的东西。子类自动拥有并因此演示继承的泛型行为,但它可以选择使该行为更特定于自己的类型。因此,多个子类可以覆盖相同的行为,并使其中的一些行为更适合于它们的使用。但是当这个链变得太长或者子类试图继承逻辑上不适用于它们的行为时,这个链就变得难以管理


因此,与继承相比,使用接口实现策略模式更有意义。

绝对如此。当您希望派生的策略共享一些公共代码时,继承最常用于抽象基类

人们更喜欢使用接口或抽象类而不是具体的基类,因为:

  • 使用依赖项反转方法,类需要与其策略松散耦合。它只需要知道策略实现了一个契约,而不想知道它的实现细节。接口和抽象类是在不指定实现的情况下定义契约的一种优雅而简单的方法

  • 大多数时候实例化基本策略类是没有意义的,因为它是一个一般的抽象概念——事实上,如果禁止实例化它会更好


  • 绝对是。当您希望派生的策略共享一些公共代码时,继承最常用于抽象基类

    人们更喜欢使用接口或抽象类而不是具体的基类,因为:

    • 使用依赖项反转方法,类需要与其策略松散耦合。它只需要知道策略实现了一个契约,而不想知道它的实现细节。接口和抽象类是在不指定实现的情况下定义契约的一种优雅而简单的方法

    • 大多数时候实例化基本策略类是没有意义的,因为它是一个一般的抽象概念——事实上,如果禁止实例化它会更好


    正如您所知,设计模式是“常见问题的通用解决方案”。它只是描述了一个一般的解决方案