首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >针对真实场景的Java架构类设计

针对真实场景的Java架构类设计
EN

Stack Overflow用户
提问于 2016-09-22 22:38:41
回答 1查看 289关注 0票数 3

这是我在Java中实现它所需要的问题:

一辆车可以是汽油车或柴油车,而混合动力车是用汽油或柴油塞住的,但不能同时用汽油和柴油。此外,混合动力汽车能够在完全不使用汽油或柴油的情况下使用电力,并且只在运行时决定是选择电力还是其他燃料来源(汽油或柴油,视情况而定)。

在这里,我需要在考虑OOP概念的情况下实现一个示例,当应该调用在汽油模式下运行的混合动力汽车时,应该调用汽油类型中的混合动力汽车方法,如果应该调用它的柴油类运行方法,也应该调用它。

我是OOP的新手,我想出了下面的设计,我知道这是错误的,如果有人能帮助我的话。

我用装饰器设计模式试过了,如果上面场景的设计是错误的,请纠正我。

Car接口

代码语言:javascript
复制
public interface Car {
        public void running();
}

汽油车级别

代码语言:javascript
复制
class PetrolCar implements Car{

    public void running() {
        System.out.println("Running in Petrol");
    }

}

柴油车等级

代码语言:javascript
复制
public class DieselCar implements Car{

    public void running() {
        System.out.println("Running in Diesel");
    }

}

抽象混合

代码语言:javascript
复制
public abstract class Hybrid implements Car{

    Car car;

    public Hybrid(Car car) {
        this.car=car;
    }

    public void running(){
        car.running();
    }

    abstract void hybridRunning();

}

实现混合类

代码语言:javascript
复制
public class HybridCar extends Hybrid{

    public HybridCar(Car car) {
        super(car);
    }

    @Override
    void hybridRunning() {
        System.out.println("Running in Hybrid Mood");
    }

}

在运行时测试用户可以选择汽车是混合汽油还是混合柴油或汽油或柴油...

代码语言:javascript
复制
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的最佳实践是否还存在一些问题?

EN

回答 1

Stack Overflow用户

发布于 2016-09-22 22:47:01

我会使用一个带有fuels的EnumSet的类。

代码语言:javascript
复制
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,您将使用不可变的类。

代码语言:javascript
复制
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());
       }
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39642088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档