[英]Java architectural class design for a real world scenario
這是我需要在Java中實現它的問題:
汽車可以是汽油車或柴油車,混合動力汽車可以使用汽油或柴油,但不能同時使用汽油或柴油。 此外,混合動力汽車具有依靠電力運行的能力,而根本不使用汽油或柴油,並且僅在運行時決定是選擇電力還是其他燃料來源(汽油或柴油)。
在這里我需要實現OOP概念,例如當應該調用汽油類型的汽油模式方法中運行的混合動力汽車時,以及如果應該調用柴油類運行方法的柴油。
我是OOP的新手,我想出了以下設計我知道如果有人能幫助我,那就錯了。
我嘗試使用裝飾器設計模式只是糾正我,如果上述情況的設計是錯誤的..
汽車接口
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最佳實踐的任何問題
我會使用一個帶有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());
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.