题目:
某汽车租赁公司出租多种轿车和客车,出租费用以日为单位计算,出租车型及信息如下表所示
车型 | 具体信息 | 日租金 | 折扣 |
轿车 | 宝马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步:明确题目中有哪此共有的属性和方法,把具有共性的属性和方法的对象抽取为类
第2步:明确哪个类中有哪些属性和方法
第3步:明确类与类之间的关系
第4步:把思路转化为代码
具体分析
第1步、第2步:如何找到类、属性、方法?
- 类和属性多数来源于需求中的名词,故把需求中涉及到的名词都罗列出来,然后进行筛选(哪些可以定义为类,哪些名词可以定义为类的属性)
- 方法和功能相关,多数来源于需求中的动词,故而把需求中的动词罗列出来,筛选哪些可以作为哪些类的方法
第3步:分析类与类之间的关系,哪些类作为子类,哪些类可以作为父类,以及哪些方法可以重写
分析应用到本案例
需求中涉及到的名词如下
汽车租赁公司、汽车、轿车、客车、宝马、别克、宇通、金龙、x6、550i、Gl8、林荫大道、座位数、车牌号、日租金、折扣
这些名词不一定都有用,接下来筛选这些名词
汽车租赁公司:在这个系统里面就一家汽车租赁公司,不可能去new若干个汽车租赁公司的对象,所以这个公司没有必要去创建类
汽车、轿车、客车:这三个名词很像,汽车类似于一个父类,而轿车和客车是子类
别克、宝马、宇通、金龙:都是汽车品牌,不管是轿车还是客车都有,那就可以把汽车品牌作为汽车的一个属性
X6、550i、GLB 、林荫大道:是型号,是轿车才有的而客车没有,所以型号这个属性只能属于轿车,不属于汽车这个父类
座位数:只有客车才有座位数,而轿车没有座位数,所有座位数这个属性只能属于客车,不属于汽车这个父类
日租金:不管是客车还是汽车都是根据日租金进行计算,到底平台可以收入多少钱,所以把它提取到父类里面作为属性
车牌号:都是车牌号,不管轿车还是客车都有车牌号,所有抽取为父类的一个特征
到此把所有的名词都筛选完了,通过演示筛选的过程,把不用的名词剔除掉,有用的名词分了到底谁是类,谁是属性,并且划分出来类与类之间的关系,以及哪些属性属于哪个类
总结:一共抽取出三个类,外加一个汽车操作类,一个测试类
- 汽车类 :品牌、车牌号、日租金
- 轿车类:品牌、车牌号、日租金、型号
- 客车类:品牌、车牌号、日租金、座位数
-
汽车操作类(业务类)
初始化车信息,数组
核心:租车 - 汽车租赁管理类(测试类)
汽车操作(业务)类:
折扣会在计算租金的时候使用,每个车都要去计算租金这个事情,而用户还要进行租车,因为最关键的就是租车,租车的关键是我这个汽车租赁公司有几辆车才能租,所以这里存在两个问题
第一:得先有这些车,所以要做车的信息初始化这个事情 ,会在汽车业务类里去做
第二:核心的租车这个事情,也会在汽车业务类里面去做
汽车租赁管理类:得有一个入口供用户选择和操作,类似于之前 的测试类
接下来就是功能的分析,也就是对需求中存在的动词进行分析
需求中涉及到的动词如下
计算租金
1.根据折扣去计算租金,每种汽车会有不同的折扣,不管是轿车还是客车,所以会把计算租金计算折扣这个方法放在汽车类里面,而轿车类和客车类去重写这个计算租金的方法(折扣不同计算方式、规则不同的,所以用到重写)
将类转化为代码
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 }