【问题标题】:Design Patterns: Reduce duplicate code from 2 methods that is almost the same in java设计模式:从 java 中几乎相同的 2 种方法中减少重复代码
【发布时间】:2011-12-13 20:52:48
【问题描述】:

我有几种类型的车辆,例如卡车、轿车、面包车、摩托车。它们之间的共同点是它们都在移动,所以我将它委托给包含这些方法的移动类:

getSpeed()
setSpeed()
getDestination()
setDestination()
..
..
..
move()

有些车辆的移动方式与其他车辆不同,所以我为它制作了一个工厂设计模式。因此,如果它是汽车(卡车、轿车、货车),它将委托给 MoveCarImpl 类,或者如果它是摩托车,它将委托给 MoveBikeImpl 类。我的问题是。自行车和汽车具有几乎完全相同的 move() 算法。唯一的区别是,bike 算法在 move() 方法的末尾调用了 1 个附加方法,而 car 的 move() 算法没有。所以现在我在 MoveCarImpl 类和 MoveBikeImpl 类中有很多重复的代码。关于如何处理这个问题的任何想法?

【问题讨论】:

    标签: java design-patterns factory-pattern delegation


    【解决方案1】:

    您可以使用自行车移动实现类扩展您的汽车移动实现类并覆盖移动方法。

    【讨论】:

    【解决方案2】:

    在基类MoveImpl 中移动MoveCarImplMoveBikeImpl 之间的公共代码。从它继承 Move car 和 Move bike 并为每个方法调用基类方法,然后执行一些额外的特定方法调用。

    【讨论】:

      【解决方案3】:

      您可以拥有一个 util 类并在其中包含一个方法,其中包含汽车和自行车使用的公共代码,但在 moveBikeImpl 中,在该 util 类的方法之后调用该额外方法。

      【讨论】:

        【解决方案4】:

        你可以创建一个 Move 类,并在这个类中编写你的 move 方法。 从 move 类扩展两个类 CarMove 和 Bike move CarMove会继承该方法,不需要做任何事情,BikeMove类可以覆盖move()方法,被覆盖的方法可以调用super move方法再调用endMove方法(),因为endMove()需要在最后调用。

        您可以灵活地为卡车、轿车等添加另一个 Move 类,该类可以继承自 Move 类。

        【讨论】:

          【解决方案5】:

          尽管我非常尊重您使用委托而不是继承的决定,但我发现拥有两个相互平行的类层次结构是一种代码味道。如果您发现向系统添加新类型的车辆需要将两个(或更多)类添加到独立的继承层次结构中,那么可能是时候重新考虑委托而不是继承的决定了。

          【讨论】:

            【解决方案6】:

            另一个选项是让 Move 类包含一个指向 Vehicle 类的指针。 (您可以将它传递给构造函数,并将其作为成员变量保存。您可能会发现泛型很有用。)Move 类可以回调 Vehicle 类以实现某些特定于车辆的行为——将 Vehicle 类视为一种策略模式。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-03-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-07-07
              • 2019-02-13
              • 1970-01-01
              相关资源
              最近更新 更多