Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设计模式:减少java中几乎相同的两种方法的重复代码_Java_Design Patterns_Factory Pattern_Delegation - Fatal编程技术网

设计模式:减少java中几乎相同的两种方法的重复代码

设计模式:减少java中几乎相同的两种方法的重复代码,java,design-patterns,factory-pattern,delegation,Java,Design Patterns,Factory Pattern,Delegation,我有几类车辆,如卡车、轿车、面包车、摩托车。它们之间的共同点是它们都在移动,因此我将其委托给一个move类,该类包含以下方法: getSpeed() setSpeed() getDestination() setDestination() .. .. .. move() 有些车辆的运动方式与其他车辆不同,因此我为其制作了一个工厂设计模式。因此,如果它是一辆汽车(卡车、轿车、面包车),它将委托给MoveCarImpl类;如果它是一辆摩托车,它将委托给MoveBikeImpl类。我的问题是。自行车

我有几类车辆,如卡车、轿车、面包车、摩托车。它们之间的共同点是它们都在移动,因此我将其委托给一个move类,该类包含以下方法:

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

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

你可以用bike move实现类扩展你的car move实现类并重写move方法。

你可以用bike move实现类扩展你的car move实现类并重写move方法。

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

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

您可以拥有一个util类,其中包含一个方法,其中包含car和bike使用的公共代码,但是在moveBikeImpl中,在这个util类的方法之后调用那个额外的方法。

你可以有一个util类,其中有一个方法,其中有一个car和bike使用的公共代码,但是在moveBikeImpl中,在这个util类的方法之后调用那个额外的方法。

你可以创建一个Move类,并在这个类中编写你的Move方法。 从move类扩展两个类CarMove和Bike move CarMove将继承该方法,无需执行任何操作,BikeMove类可以重写move()的方法,被重写的方法可以调用super move方法,然后调用endMove方法(),因为endMove()需要在最后调用


而且你可以灵活地为卡车添加另一个Move类,sedan e.t.c,它可以继承Move类。

你可以创建一个Move类,并在这个类中编写你的Move方法。 从move类扩展两个类CarMove和Bike move CarMove将继承该方法,无需执行任何操作,BikeMove类可以重写move()的方法,被重写的方法可以调用super move方法,然后调用endMove方法(),因为endMove()需要在最后调用


u还可以灵活地为truck添加另一个Move类sedan e.t.c,它可以从Move类继承。

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

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

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

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

@Dan请不要忘记标记接受的答案,这对解决问题最有帮助。看到了吗?@Dan请别忘了标记接受的答案,这对解决问题最有帮助。看到了吗?