09_1.多态案例——汽车租赁系统
车型 | 具体信息 | 日租金 | 折扣 |
轿车 | 宝马X6(豫A00000) | 800 |
days>7天9折 days>30天8折 days>150天7折 |
宝马550i(豫V66666) | 600 | ||
别克林荫大道(豫V88888) | 300 | ||
别克GL8(豫V99999) | 600 | ||
客车 | 宇通,16座(豫A19191) | 800 |
days>=3天9折 days>=7天8折 days>=30天7折 days>=150天6折 |
金龙,16座(豫V32232) | |||
宇通,34座(豫A89898) | 1500 | ||
金龙,34座(豫V56565) |
需求:使用面向对象思想开发汽车租赁系统 ,通过控制台选择要租的车辆信息,然后把车牌信息,总租金返回给控制台。
***********欢迎光临汽车租赁有限公司***********
请选择您要租赁的车型:1、轿车 2、客车
1
请选择要租赁的汽车品牌:1、别克 2、宝马
1
请选择您要租赁的汽车型号 1、林荫大道 2、GLB
1
请输入您要租赁的汽车的天数:
20
分配给您的车牌号为:豫V88888
您需要支付的租赁费用为:5400.0元
分析
三明确一转化
- 类和属性多数来源于需求中的名词,故把需求中涉及到的名词都罗列出来,然后进行筛选(哪些可以定义为类,哪些名词可以定义为类的属性)
- 方法和功能相关,多数来源于需求中的动词,故而把需求中的动词罗列出来,筛选哪些可以作为哪些类的方法
- 汽车类 :品牌、车牌号、日租金
- 轿车类:品牌、车牌号、日租金、型号
- 客车类:品牌、车牌号、日租金、座位数
-
汽车操作类(业务类)
初始化车信息,数组
核心:租车 - 汽车租赁管理类(测试类)
1 package cn.com.vehicles; 2 //父类:汽车类 3 public class Auto { 4 //车牌号 品牌 日租金 5 private String autoId; //车牌号 6 private String brand;//品牌 7 private int riJuJin;//日租金 8 public Auto() { 9 // TODO Auto-generated constructor stub 10 } 11 12 public Auto(String autoId, String brand, int riJuJin) { 13 this.autoId = autoId; 14 this.brand = brand; 15 this.riJuJin = riJuJin; 16 } 17 18 public String getAutoId() { 19 return autoId; 20 } 21 22 public void setAutoId(String autoId) { 23 this.autoId = autoId; 24 } 25 26 public String getBrand() { 27 return brand; 28 } 29 30 public void setBrand(String brand) { 31 this.brand = brand; 32 } 33 34 public int getRiJuJin() { 35 return riJuJin; 36 } 37 38 public void setRiJuJin(int riJuJin) { 39 this.riJuJin = riJuJin; 40 } 41 //计算租金的方法--根据租赁周期来计算租金 42 public double jiSuanJuJin(int days) { 43 return 0.0; 44 } 45 }
父类:汽车类
1 package cn.com.vehicles; 2 3 //子类:客车类 4 public class Bus extends Auto { 5 //座位数 6 private int seatCount; 7 public Bus() { 8 // TODO Auto-generated constructor stub 9 } 10 public Bus(String autoId, String brand, int riJuJin,int seatCount) { 11 super(autoId, brand, riJuJin); 12 // TODO Auto-generated constructor stub 13 this.seatCount=seatCount; 14 } 15 public int getSeatCount() { 16 return seatCount; 17 } 18 public void setSeatCount(int seatCount) { 19 this.seatCount = seatCount; 20 } 21 //根据客车计算租金的规则重写父类方法 22 @Override 23 public double jiSuanJuJin(int days) { 24 // 租金 = 日租金 * 租赁周期 25 double price = this.getRiJuJin()*days; 26 //折扣规则 27 if(days>=3&&days<7) { 28 price = price * 0.9; 29 }else if(days>=7 && days<30) { 30 price = price * 0.8; 31 }else if(days>=30&&days<150) { 32 price = price * 0.7; 33 }else if(days>=150) { 34 price = price * 0.6; 35 } 36 return price; 37 } 38 39 }
子类:客车类
1 package cn.com.vehicles; 2 //子类:轿车类 3 public class Car extends Auto { 4 //型号 5 private String type; 6 //无参构造方法 7 public Car() { 8 // TODO Auto-generated constructor stub 9 } 10 //有参构造 11 public Car(String autoId, String brand, int riJuJin,String type) { 12 super(autoId, brand, riJuJin); 13 // TODO Auto-generated constructor stub 14 this.type = type; 15 } 16 17 18 public String getType() { 19 return type; 20 } 21 22 23 24 25 public void setType(String type) { 26 this.type = type; 27 } 28 29 //根据轿车计算租金的规则重写父类方法 30 @Override 31 public double jiSuanJuJin(int days) { 32 // 租金 = 日租金 * 租赁周期 33 double price = this.getRiJuJin()*days; 34 //折扣规则 35 if(days>7&&days<=30) { 36 price = price * 0.9; 37 }else if(days>30 && days<=150) { 38 price = price * 0.8; 39 }else if(days>150) { 40 price = price * 0.7; 41 } 42 return price; 43 } 44 }
子类:轿车类
1 package cn.com.manage; 2 //汽车业务类 3 4 import cn.com.vehicles.Auto; 5 import cn.com.vehicles.Bus; 6 import cn.com.vehicles.Car; 7 8 public class AutoOperation { 9 Auto[] autos = new Auto[8]; 10 public AutoOperation() { 11 init(); 12 } 13 //汽车信息初始化 14 public void init() { 15 autos[0] = new Car("豫A00000","宝马",800,"X6"); //Auto a = new Car(); 16 autos[1] = new Car("豫V66666","宝马",600,"550i"); //Auto a = new Car(); 17 autos[2] = new Car("豫V88888","别克",300,"林荫大道"); //Auto a = new Car(); 18 autos[3] = new Car("豫V99999","别克",600,"GL8"); //Auto a = new Car(); 19 autos[4] = new Bus("豫A19191","宇通",800,16); //Auto a = new Bus(); 20 autos[5] = new Bus("豫V32232","金龙",800,16); //Auto a = new Bus(); 21 autos[6] = new Bus("豫A89898","宇通",1500,34); //Auto a = new Bus(); 22 autos[7] = new Bus("豫V56565","金龙",1500,34); //Auto a = new Bus(); 23 } 24 //租车 25 //参数:品牌 座位数 型号 (客车:品牌、座位、"" 轿车:品牌 0 型号) 26 public Auto juche(String brand,int seatCount,String type) { 27 Auto a = null; 28 //根据用户提供的租车信息(方法参数)去遍历汽车数组,找到相应车辆返回给用户 29 for (int i = 0; i < autos.length; i++) { 30 if(autos[i] instanceof Car) { //判断atuos[i] 是不是Car 31 //轿车d 32 Car car = (Car)autos[i];//向下转型 33 //轿车的品牌和型号与用户想要 的轿车品牌和型号吻合 34 if(car.getBrand().equals(brand)&&car.getType().equals(type)) { 35 a=car; 36 break; 37 } 38 }else { 39 //客车 40 Bus bus = (Bus)autos[i];//向下转型 41 //客车的品牌和座位数与用户想要的品牌和座号吻合 42 if(bus.getBrand().equals(brand)&&bus.getSeatCount()==seatCount){ 43 a=bus; 44 break; 45 } 46 } 47 } 48 return a; 49 } 50 51 52 }
汽车业务类
1 package cn.com.manage; 2 3 import java.util.Scanner; 4 5 import cn.com.vehicles.Auto; 6 7 //汽车租赁管理类,入口测试 8 public class AutoTest { 9 public static void main(String[] args) { 10 Scanner input = new Scanner(System.in); 11 AutoOperation autoOpr = new AutoOperation(); 12 System.out.println("***********欢迎光临汽车租赁有限公司***********"); 13 System.out.println("请选择您要租赁的车型:1、轿车 2、客车"); 14 int autoType=input.nextInt(); 15 //获取用户输入的三个条件:品牌 座位数 型号 16 String brand = ""; 17 int seatCount = 0; 18 String type = ""; 19 switch (autoType) { 20 case 1: 21 System.out.println("请选择要租赁的汽车品牌:1、别克 2、宝马"); 22 int choose = input.nextInt(); 23 if(choose == 1) { 24 brand = "别克"; 25 System.out.println("请选择您要租赁的汽车型号 1、林荫大道 2、GLB"); 26 type = (input.nextInt()==1)?"林荫大道":"GL8"; 27 }else { 28 brand = "宝马"; 29 System.out.println("请选择您要租赁的汽车型号 1、X6 2、550i"); 30 type = (input.nextInt()==1)?"X6":"550i"; 31 } 32 break; 33 case 2://租赁客车,获取用户想租赁的客车和品牌及座位信息 34 System.out.println("请选择要租赁的汽车品牌:1、宇通 2、金龙"); 35 brand = (input.nextInt()==1)?"宇通":"金龙"; 36 System.out.println("请选择要租赁的汽车位数:1、16座 2、34座"); 37 seatCount = (input.nextInt()==1)?16:34; 38 break; 39 } 40 //租车 41 Auto auto=autoOpr.juche(brand, seatCount, type); 42 //提示用户租车的车牌号 计算租金 43 System.out.println("请输入您要租赁的汽车的天数:"); 44 int days = input.nextInt(); 45 double price = auto.jiSuanJuJin(days); 46 System.out.println("分配给您的车牌号为:"+auto.getAutoId()); 47 System.out.println("您需要支付的租赁费用为:"+price+"元"); 48 } 49 }
汽车租赁管理类,入口测试