09_1.多态案例——汽车租赁系统

时间:2024-02-18 18:06:53
题目:
  某汽车租赁公司出租多种轿车和客车,出租费用以日为单位计算,出租车型及信息如下表所示
车型 具体信息 日租金 折扣
轿车 宝马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. 汽车类 :品牌、车牌号、日租金
  2. 轿车类:品牌、车牌号、日租金、型号
  3. 客车类:品牌、车牌号、日租金、座位数
  4. 汽车操作类(业务类)
    初始化车信息,数组
    核心:租车

  5. 汽车租赁管理类(测试类)
  汽车操作(业务)类:
    折扣会在计算租金的时候使用,每个车都要去计算租金这个事情,而用户还要进行租车,因为最关键的就是租车,租车的关键是我这个汽车租赁公司有几辆车才能租,所以这里存在两个问题
    第一:得先有这些车,所以要做车的信息初始化这个事情 ,会在汽车业务类里去做
    第二:核心的租车这个事情,也会在汽车业务类里面去做
  汽车租赁管理类:得有一个入口供用户选择和操作,类似于之前 的测试类
 
 
 
  接下来就是功能的分析,也就是对需求中存在的动词进行分析
  需求中涉及到的动词如下
    计算租金
    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 }
汽车租赁管理类,入口测试