我昨天参加了一次面试,并被问到一个OOD问题:
赛车店系统:
该系统存储关于玩家可用汽车的信息。
- 有两种换挡策略:手动/自动。
- 有两种燃料类型:汽油/柴油。
设计一个系统,可以为玩家提供请求的汽车(如果玩家想要一辆手动换挡并且燃烧柴油的汽车,则你的系统应该提供符合要求的汽车实例)。该系统应具有良好的可扩展性和可维护性。
我的想法和解决方案:
我的想法是需求包含两个属性:换挡和燃料。我打算创建一个包含这些属性及相应行为的抽象类。考虑到可扩展性,我会创建一个包含汽车行为的接口Movable
。
如果将来添加任何新属性,则可以创建一个包含新属性的新抽象类或将该属性添加到现有抽象类中,如果需要新的行为,则可以创建新接口或将该行为添加到现有接口中。
这是我的解决方案:
一个接口包含常规行为,当前只有 showSpecs()
。
public interface Movable {
public String showSpecs();
}
抽象类包含属性 fuel
和 gear
public abstract class Car implements Movable {
String gear;
String fuel;
abstract void setFuel(String fuel);
abstract String getFuel();
abstract void setGear(String gear);
abstract String getGear();
}
现在是关于赛车类的实现:
public class RaceCar extends Car {
public RaceCar(String fuel, String gear) {
this.fuel = fuel;
this.gear = gear;
}
public void setFuel(String fuel) {
this.fuel = fuel;
}
public String getFuel() {
return this.fuel;
}
public void setGear(String gear) {
this.gear = gear;
}
public String getGear() {
return this.gear;
}
public String showSpecs() {
StringBuilder sb = new StringBuilder();
sb.append("Gear:").append(this.gear);
sb.append("Fuel:").append(this.fuel);
return sb.toString();
}
}
以下是我拥有的主类:
public class Main {
public static void main(String[] args) {
System.out.println("get started...");
Car car = new RaceCar("diseal", "automatic");
System.out.println(car.showSpecs());
}
}
面试官回答说,我提供的解决方案不可扩展且难以维护,但没有提供详细信息,因此我仍然对我的错误和如何改进感到困惑。有人能帮忙分享您的想法,并指出我应该改进什么吗?谢谢!
Movable
或者Car
的必要:只需要定义一个RaceCar
类,给它两个字段并赋予构造函数。为燃料和车辆字段的值定义枚举类型即可。但是关于可扩展性——我很难理解实际上需要什么:每次想要一个实例时都调用构造函数;仅仅调用构造函数似乎已经足够而且是必要的。 - Andy Turner