设计模式:减少java中几乎相同的两种方法的重复代码
我有几类车辆,如卡车、轿车、面包车、摩托车。它们之间的共同点是它们都在移动,因此我将其委托给一个move类,该类包含以下方法:
getSpeed()
setSpeed()
getDestination()
setDestination()
..
..
..
move()
有些车辆的运动方式与其他车辆不同,因此我为其制作了一个工厂设计模式。因此,如果它是一辆汽车(卡车、轿车、面包车),它将委托给MoveCarImpl类;如果它是一辆摩托车,它将委托给MoveBikeImpl类。我的问题是。自行车和汽车的move()算法几乎完全相同。唯一的区别是bike算法在move()方法的末尾调用了1个额外的方法,而car的move()算法没有。所以现在我在MoveCarImpl类和MoveBikeImpl类中有很多重复的代码。有没有办法解决这个问题
# 1 楼答案
你可以创建一个Move类,并在这个类中编写你的Move方法。 从move类扩展到CarMove和Bike move两个类 CarMove将继承该方法,无需执行任何操作,BikeMove类可以重写move()的方法,被重写的方法可以调用super move方法,然后调用endMove方法(),因为endMove()需要在最后调用
u将可以灵活地为卡车添加另一个Move类sedan e.t.c,它可以继承Move类
# 2 楼答案
另一个选项是Move类包含一个指向Vehicle类的指针。(您可以将其传递到构造函数中,并将其作为成员变量保存。您可能会发现泛型很有用。)Move类可以为某些特定于车辆的行为调用Vehicle类——将Vehicle类视为一种策略模式
# 3 楼答案
可以使用bike move实现类扩展car move实现类,并重写move方法
# 4 楼答案
虽然我非常尊重您使用委托而不是继承的决定,但我发现拥有两个相互并行的类层次结构是一种代码味道。如果您发现向系统添加新类型的车辆需要向独立继承层次结构添加两个(或更多)类,那么可能是时候重新考虑委派而不是继承的决定了
# 5 楼答案
您可以有一个util类,其中有一个方法,包含car和bike使用的公共代码,但是在moveBikeImpl中,在这个util类的方法之后调用这个额外的方法
# 6 楼答案
在基类
MoveImpl
中的MoveCarImpl
和MoveBikeImpl
之间移动公共代码。从中继承Move car和Move bike,并为每个方法调用基类方法,然后执行一些额外的特定方法调用