这是我在Java中实现它所需要的问题:
一辆车可以是汽油车或柴油车,而混合动力车是用汽油或柴油塞住的,但不能同时用汽油和柴油。此外,混合动力汽车能够在完全不使用汽油或柴油的情况下使用电力,并且只在运行时决定是选择电力还是其他燃料来源(汽油或柴油,视情况而定)。
在这里,我需要在考虑OOP概念的情况下实现一个示例,当应该调用在汽油模式下运行的混合动力汽车时,应该调用汽油类型中的混合动力汽车方法,如果应该调用它的柴油类运行方法,也应该调用它。
我是OOP的新手,我想出了下面的设计,我知道这是错误的,如果有人能帮助我的话。
我用装饰器设计模式试过了,如果上面场景的设计是错误的,请纠正我。
Car接口
public interface Car {
public void running();
}汽油车级别
class PetrolCar implements Car{
public void running() {
System.out.println("Running in Petrol");
}
}柴油车等级
public class DieselCar implements Car{
public void running() {
System.out.println("Running in Diesel");
}
}抽象混合
public abstract class Hybrid implements Car{
Car car;
public Hybrid(Car car) {
this.car=car;
}
public void running(){
car.running();
}
abstract void hybridRunning();
}实现混合类
public class HybridCar extends Hybrid{
public HybridCar(Car car) {
super(car);
}
@Override
void hybridRunning() {
System.out.println("Running in Hybrid Mood");
}
}在运行时测试用户可以选择汽车是混合汽油还是混合柴油或汽油或柴油...
public class App {
public static void main(String[] args) {
String neededType = "Petrol";
boolean hybrid = true;
if (hybrid) {
Hybrid hCar=null;
if (neededType.equalsIgnoreCase("Petrol")) {
hCar=(Hybrid)new HybridCar(new PetrolCar());
} else if (neededType.equalsIgnoreCase("Diesel")) {
hCar=new HybridCar(new DieselCar());
}
hCar.hybridRunning();
hCar.running();
} else {
Car car=null;
if (neededType.equalsIgnoreCase("Petrol")) {
car=new PetrolCar();
} else if (neededType.equalsIgnoreCase("Diesel")) {
car=new DieselCar();
}
}
}
}这是正确的吗?关于OOP的最佳实践是否还存在一些问题?
发布于 2016-09-22 22:47:01
我会使用一个带有fuels的EnumSet的类。
public interface Car {
static Car create(Fuel fuel, Fuel... others) {
return new CarImpl(EnumSet.of(fuel, others));
}
Set<Fuel> fuels();
void running();
enum Fuel {
Petrol, Diesel, LPG, Hydrogren, Electric
}
}如果不使用Enum,您将使用不可变的类。
public interface Car {
static Car create(Fuel fuel, Fuel... others) {
Set<Fuel> fuels = new HashSet<>();
fuels.add(fuel);
Collections.addAll(fuels, others);
return new CarImpl(fuels);
}
Set<Fuel> fuels();
void running();
void setMode (Fuel fuel) throws IllegalArgumentException;
Fuel getMode ();
class Fuel {
private final String name;
public Fuel(String name) { this.name = name; }
public String name() { return name; }
public String toString() { return name(); }
public int hashCode() { return name().hashCode(); }
public boolean equals(Object o) {
return o instnaceof Fuel && ((Fuel) o).name().equals(name());
}
}
}https://stackoverflow.com/questions/39642088
复制相似问题