2011-10-24 24 views
1

我有几种类型的车辆,如卡车,轿车,面包车,摩托车。它们之间的共同点是,他们都动,所以我把它委托给它包含这些方法的移动类:设计模式:减少java中几乎相同的两种方法的重复代码

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

有些车辆不同移动然后别人让我做一个工厂设计模式吧。因此,如果它是一辆汽车(卡车,轿车,面包车),它将委托给MoveCarImpl班,或者如果是摩托车,则委托MoveBikeImpl班。我的问题是。自行车和汽车具有几乎完全相同的move()算法。唯一的区别是自行车算法在move()方法结束时调用1个附加方法,而car()的move()算法则不调用。所以现在我在MoveCarImpl类和MoveBikeImpl类中有很多重复的代码。有关如何处理这个问题的任何想法?

回答

2

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

+1

完全忘了继承....谢谢! – Dan

+0

@丹请不要忘记标记接受的答案,这对解决问题最有帮助。另请参阅[如何接受答案工作](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)? – Lionel

2

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

0

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

0

你可以制作一个Move类,并且在这个类中写出你的移动方法。 扩展了两个类CarMove和Bike从move类移动 CarMove将继承该方法,不需要做任何事情,BikeMove类可以覆盖move()方法,overrided方法可以调用super move方法然后endMove方法(),因为endMove ()需要在最后调用。

您将可以灵活地为可以从Move类继承的卡车sedan e.t.c添加另一个Move类。

0

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

0

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