当前位置: 首页 > 知识库问答 >
问题:

针对真实场景的Java体系结构类设计

韦修文
2023-03-14

这就是我需要在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最佳实践有什么问题吗?

共有1个答案

汝才良
2023-03-14

我会使用一个带有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());
       }
    }
}
 类似资料:
  • 我是新来的阿科雷和斯内福。我在arSceneView中有一个arObject,我想在场景中隐藏它(几秒钟)。我不想从场景中分离()锚点,只需将其隐藏,然后在几秒钟后再次显示。 我已尝试更改的参数。sfa文件,但它不起作用 或者我还缺少什么别的方法

  • 具有以下商业案例: 电子邮件促销活动表示,第一个点击链接的1_000_000用户将获得奖金。用户在访问网页时会立即看到奖金或“对不起”消息。 问题:如何设计此解决方案? 选项1:独石。原子整数。CAS问题可以在这里发生吗?或者1_000_000不是在这种情况下引起问题的金额吗?能做到这一点的数字是多少

  • Ceph 独一无二地用统一的系统提供了对象、块、和文件存储功能,它可靠性高、管理简便、并且是自由软件。 Ceph 的强大足以改变贵公司的 IT 基础架构、和管理海量数据的能力。Ceph 可提供极大的伸缩性——供成千用户访问 PB 乃至 EB 级的数据。 Ceph 节点以普通硬件和智能守护进程作为支撑点, Ceph 存储集群组织起了大量节点,它们之间靠相互通讯来复制数据、并动态地重分布数据。 Cep

  • 问题内容: 我想确保我的项目在软件包之间不包含不必要的依赖关系。例如,我要确保项目具有分层结构。即模型位于一切之下,业务逻辑取决于模型,视图取决于业务逻辑和模型。每层都放置在自己的包装中。 您能推荐一些开源工具,让我指定这些约束并将其作为持续集成的一部分进行检查吗? PS我知道我可以在单独的Maven模块中分离项目。不幸的是,我的现实情况比三层系统更复杂。如果我使用Maven模块,那么我将拥有数十

  • 本文向大家介绍hdfs的体系结构相关面试题,主要包含被问及hdfs的体系结构时的应答技巧和注意事项,需要的朋友参考一下 解答: hdfs有namenode、secondraynamenode、datanode组成。 为n+1模式 namenode负责管理datanode和记录元数据 secondraynamenode负责合并日志 datanode负责存储数据

  • 冯·诺依曼体系结构 计算机处理的数据和指令一律用二进制数表示 顺序执行程序 计算机运行过程中,把要执行的程序和处理的数据首先存入主存储器(内存),计算机执行程序时,将自动地并按顺序从主存储器中取出指令一条一条地执行,这一概念称作顺序执行程序。 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。 数据的机内表示 二进制表示 机器数 由于计算机中符号和数字一样,都必须用二进制数串来表