2016-09-22 47 views
3

這是我需要實現它在Java中的問題: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最佳實踐的問題 在此先感謝

+6

我會有一個類'汽車'和'enum燃料'與汽油,柴油,液化石油氣,氫,電動EnumSet。例如有石油氣和汽油,或汽油和電力是常見的。 –

+1

@Peter甚至[專有](https://en.wikipedia.org/wiki/Nissan_Leaf)。 –

+1

@ElliottFrisch Solar甚至https://www.worldsolarchallenge.org/ –

回答

4

我會用燃料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()); 
     } 
    } 
} 
+0

「我將使用一個具有EnumSet燃料的類。」等到你需要把你的汽車交給一名機修工(電工),突然之間他們使用的燃料之間的區別已經不足以處理一個單一的汽車課程。 –

+1

@AdrianColomitchi然後它應該擴大。包括汽車各個方面的枚舉以及它可能成爲什麼。誠然,在這一點上,我們不妨製作一個vin解碼器,讓製造商爲我們做這件事。 –

+0

@AdrianColomitchi我同意。在添加其他課程之前,我會等到您需要多個課程。 ;) –