【JAVA学习笔记】汽车租赁系统

学习自华为开发者学院陈璇老师的JAVA系列课程

一、面向对象设计

  1. 具有相同属性和方法的对象抽取为类

  2. 考虑类的属性和方法

  3. 考虑各个类之间的关系

  4. 搭建好框架后,转化为代码


    需求分析

    汽车业务类的两个方法分析:

  5. 汽车信息初始化
    数组存储汽车信息(汽车:客车 轿车)
    数组类型:父类类型Vehicle

  6. 租赁汽车:返回值为父类类型Vehicle 父类类型作为方法返回值(多态)
    用户需要提供的信息:客车(品牌 座位数)、轿车(品牌、型号) --- 方法参数
    通用的参数:品牌 座位数 型号(客车:品牌 座位数 ""; 轿车:品牌 0 型号)

    方法体:根据用户提供的租车信息(方法参数)去遍历汽车数组,找到相应车辆返回给用户

租赁天数:在计算租金时使用,在测试类(汽车租赁管理类)中直接使用
日期类:略

由于父类写了计算租金的抽象方法,子类也重写过了该方法,所以在测试类中只需要调用父类的计算租金的方法即可,它与租车业务无关。

二、代码实现

2.1 汽车相关类

cn.com.vehicles:
Vehicle.java

package cn.com.vehicles;

//父类:汽车类
public abstract class Vehicle {
    //车牌号 品牌 日租金
    private String vehicleId;
    private String brand;
    private int perRent;

    public Vehicle(){}

    public Vehicle(String vehicleId, String brand, int perRent) {
        this.vehicleId = vehicleId;
        this.brand = brand;
        this.perRent = perRent;
    }

    public String getVehicleId() {
        return vehicleId;
    }

    public void setVehicleId(String vehicleId) {
        this.vehicleId = vehicleId;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getPerRent() {
        return perRent;
    }

    public void setPerRent(int perRent) {
        this.perRent = perRent;
    }

    //抽象方法:计算租金-->根据租赁周期来计算租金
    public abstract float calcRent(int days);
}

Car.java

package cn.com.vehicles;

//轿车类
public class Car extends Vehicle {
    //型号
    private String type;

    public Car(){}

    public Car(String vehicleId, String brand, int perRent, String type){
        super(vehicleId, brand, perRent);
        this.type = type;
    }


    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    //根据轿车计算租金的规则重写父类方法
    public float calcRent(int days) {
        //租金 = 日租金 * 租赁周期
        float price = this.getPerRent() * days;
        //折扣规则
        if (days>7 && days<=30) {
           price *= 0.9f;  //让计算认为0.9是float
        }else if (days>30 && days<=150){
            price *= 0.8f;
        }else if (days>150) {
            price *= 0.7f;
        }
        return price;
    }
}

Bus.java

package cn.com.vehicles;

//客车类
public class Bus extends Vehicle {
    //座位数
    private int seatCount;

    public Bus(){}

    public Bus(String vehicleId, String brand, int perRent, int seatCount){
        super(vehicleId, brand, perRent);
        this.seatCount = seatCount;
    }

    public int getSeatCount() {
        return seatCount;
    }

    public void setSeatCount(int seatCount) {
        this.seatCount = seatCount;
    }

    //根据客车计算租金的规则重写父类方法
    public float calcRent(int days) {
        //租金 = 日租金 * 租赁周期
        float price = this.getPerRent() * days;
        //折扣规则
        if (days>=3 && days<7) {
           price *= 0.9f;  //让计算认为0.9是float
        }else if (days>=7 && days<30){
            price *= 0.8f;
        }else if (days>=30 && days<150) {
            price *= 0.7f;
        }else if (days>=150) {
            price *= 0.6f;
        }
        return price;
    }
}

2.2 汽车业务类

cn.com.manage

VehicleOperation.java

package cn.com.manage;

import cn.com.vehicles.Car;
import cn.com.vehicles.Vehicle;
import cn.com.vehicles.Bus;

//汽车业务类
public class VehicleOperation {
    //汽车数组
    Vehicle[] vehicles = new Vehicle[8];

    //汽车信息初始化
    public void init() {
        //向上转型
        //多态的一种使用,父类引用指向子类对象 类似于Vehicle v = new Car(); v = new Bus();
        vehicles[0] = new Car("京N85764","宝马",800,"X6");
        vehicles[1] = new Car("京L79654","宝马",600,"550i");
        vehicles[2] = new Car("京Y96854","别克",400,"林荫大道");
        vehicles[3] = new Car("京M36589","别克",500,"GL8");
        vehicles[4] = new Bus("京Y85764","金龙",1000,34);
        vehicles[5] = new Bus("京U88888","金龙",800,16);
        vehicles[6] = new Bus("京T66666","金杯",1200,34);
        vehicles[7] = new Bus("京P90876","金杯",700,16);
    }

    //租车: 简单工厂模式
    //品牌 座位数 型号(客车:品牌 座位数 ""; 轿车:品牌 0 型号)
    public Vehicle rentVehicle(String brand, int seatCount, String type) {
        Vehicle v = null;
        //根据用户提供的租车信息(方法参数)去遍历汽车数组,找到相应车辆返回给用户
        for (Vehicle vehicle:vehicles) {
            if (vehicle instanceof Car) {
                //轿车
                Car car = (Car)vehicle; //向下转型
                //轿车的品牌和型号与用户想要的轿车的品牌和型号吻合
                if (car.getBrand().equals(brand) && car.getType().equals(type)) {
                    v = car;
                    break;
                }
            }else{
                //客车
                Bus bus = (Bus)vehicle; //向下转型
                //客车的品牌和座位数与用户想要的轿车的品牌和座位数吻合
                if (bus.getBrand().equals(brand) && bus.getSeatCount()==seatCount) {
                    v = bus;
                    break;
                }
            }
        }
        return v;
    }
}

2.3 汽车租赁管理类

cn.com.manage

VehicleRent.java

package cn.com.manage;

import cn.com.vehicles.Vehicle;

import java.util.Scanner;

//汽车租赁管理类:入口测试类
public class VehicleRent {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        VehicleOperation vehicleOpr = new VehicleOperation();
        System.out.println("**************欢迎光临腾飞汽车租赁有限公司*************");
        System.out.print("请选择您需要租赁的车型:1.轿车;2.客车:");
        int vehicleType = input.nextInt();

        //获取用户租赁的3个条件: 品牌 座位数 型号
        String brand = "";
        int seatCount = 0;
        String type = "";
        switch (vehicleType) {
            case 1: //租赁轿车 获取到用户想租赁的轿车的品牌和型号信息
                System.out.print("请选择您要租赁的汽车品牌:1、别克 2、宝马");
                int choose = input.nextInt();
                if (choose == 1) {
                    brand = "别克";
                    System.out.print("请选择您要租赁的汽车类型:1、林荫大道 2、GL8");
                    type = (input.nextInt() == 1) ? "林荫大道" : "GL8" ;
                }else{
                    brand = "宝马";
                    System.out.print("请选择您要租赁的汽车类型:1、X6 2、550i");
                    type = (input.nextInt() == 1) ? "X6" : "550i" ;
                }
                break;
            case 2: //租赁客车 获取到用户想租赁的客车的品牌和座位数信息
                System.out.print("请选择您要租赁的汽车品牌:1、金杯 2、金龙");
                brand = (input.nextInt() == 1) ? "金杯" : "金龙";
                System.out.print("请选择您要租赁的汽车座位数:1、16座 2、34座");
                seatCount = (input.nextInt() == 1) ? 16 : 34;
                break;
            default:
                break;
        }

        //初始化汽车信息
        vehicleOpr.init();

        //租车
        Vehicle v = vehicleOpr.rentVehicle(brand,seatCount,type);
        //提示用户租车的车牌号 计算租金(多态,会根据具体返回的汽车子类对象,返回重写后的计算租金方法)
        System.out.print("请输入您需要租赁的天数:");
        int days = input.nextInt();
        float price = v.calcRent(days);
        System.out.println("分配给您的汽车的牌号为:"+v.getVehicleId());
        System.out.println("您需要的支付的租赁费用为"+price+"元");
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容