多态的设计应用及实现之汽车租价计算

本文详细阐述了汽车出租商如何根据汽车购买价格和种类制定每日租金,包括家用轿车、旅行车、越野车和大客车的计算规则。通过源文件读取、计算租金并输出按购买日期降序排列的价格清单,确保了代码的易修改性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标: 多态的设计应用及实现.

汽车出租商准备根据汽车购买的价格及汽车种类来制定
各种汽车的每日租金.
具体规则如下:

家用轿车: 购买价格 * (1/1000) + 10
旅行车: 购买价格 * (2/1000)
越野车: 购买价格 * (3/1000)
大客车: 购买价格 * (3/1000) + 400

计算并生成价格清单, 并在大客车前面加上'*'来标识. 输出结果按购买日期降序排列.
源文件及输出文件的价格单位都精确到元. 计算中出现不足1元的部分以1元来计算.
汽车分类及计算方法可能会根据今后业务发展情况调整, 因此请尽量保持代码易于修改和维护.

源文件格式:(源文件请自行编制,文件名请用src.txt)
车辆名称 购买价格 购买日期 车辆类型
金杯 100000 2007-08-02 旅行车
宝马X5 1000000 2007-01-29 越野车
别克 80201 2008-02-06 家用轿车
黄海 1200000 2009-01-03 大客车

输出格式: [标记] [购买价格] [购买日期] [车辆类型] [计算后价格](输出文件文件名请用dst.txt)
* 黄海 1200000 2009-01-03 大客车 4000

package com.neusoft; import java.util.*; import java.io.*; import java.math.BigDecimal; import java.text.*; /** * 主函数类 * @author * */ public class MainRent { public static List<Car> readFile() throws IOException{ List<Car> carList = new ArrayList<Car>(); String s = ""; BufferedReader br=null; try{ br = new BufferedReader(new FileReader("c:\\src.txt")); try{ while(((s=br.readLine())!=null)){ Car car; String[] buf = s.split(" "); if(buf[3].equals("大客车")) car= new BigBus(); else if(buf[3].equals("旅行车")) car = new TravelCar(); else if(buf[3].equals("越野车")) car= new YueyeCar(); else car = new HomeCar(); car.setCarName(buf[0]); car.setPrice(new BigDecimal(buf[1])); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(buf[2]); car.setDate(date); car.setCarClass(buf[3]); carList.add(car); } }catch(Exception e){ e.printStackTrace(); } }catch(FileNotFoundException e){ e.printStackTrace(); }finally{ if(br!=null){ br.close(); System.out.println("文件关闭"); } } return carList; } public static void writeFile(List<Car> carList){ BufferedWriter bw=null; try{ bw= new BufferedWriter(new FileWriter("c:/dst.txt")); for(Iterator<Car> it = carList.iterator();it.hasNext();){ bw.write(it.next().toString()); bw.newLine(); } bw.close(); }catch(Exception e){ e.printStackTrace(); }finally{ try { bw.close(); System.out.println("再次关闭文件"); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException{ List<Car>carList = readFile(); Collections.sort(carList, new Comparator<Object>(){ public int compare(Object o1,Object o2){ Car car1 = (Car)o1; Car car2 = (Car)o2; return car2.getDate().compareTo(car1.getDate()); } }); writeFile(carList); } } package com.neusoft; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; /** * 洗车的基础类 * * @author * */ public class Car { protected String carName;// 车辆名称 protected BigDecimal price;// 购买价格 protected Date date;// 购买日期 protected String carClass;// 车辆类别 /** * 计算租金 * * @return BigDecimal */ public BigDecimal countRent1() { return new BigDecimal("0"); } /** * @return the carClass */ public String getCarClass() { return carClass; } /** * @return the carName */ public String getCarName() { return carName; } /** * @return the date */ public Date getDate() { return date; } /** * @return the price */ public BigDecimal getPrice() { return price; } /** * @param carClass * the carClass to set */ public void setCarClass(String carClass) { this.carClass = carClass; } /** * @param carName * the carName to set */ public void setCarName(String carName) { this.carName = carName; } /** * @param date * the date to set */ public void setDate(Date date) { this.date = date; } /** * @param price * the price to set */ public void setPrice(BigDecimal price) { this.price = price; } public String toString() { String ret = ""; if (carClass.equals("大客车")) ret += "*"; else ret += " "; ret += carName + " " + price + " " + new SimpleDateFormat("yyyy-MM-dd").format(date) + " " + carClass + " " + countRent1(); return ret; } } package com.neusoft; import java.math.BigDecimal; /** * 大客车类,继承基础车类 * * @author * */ public class BigBus extends Car { @Override public BigDecimal countRent1() { BigDecimal ret = null; ret = price .multiply(new BigDecimal("3").divide(new BigDecimal("1000"))) .add(new BigDecimal("400")); ret = ret.setScale(0, BigDecimal.ROUND_CEILING); return ret; } } package com.neusoft; import java.math.BigDecimal; /** * 家用轿车类,继承基础车类 * * @author * */ public class HomeCar extends Car { @Override public BigDecimal countRent1() { BigDecimal ret = null; ret = price .multiply(new BigDecimal("1").divide(new BigDecimal("1000"))) .add(new BigDecimal("10")); ret = ret.setScale(0, BigDecimal.ROUND_CEILING); return ret; } } package com.neusoft; import java.math.BigDecimal; /** * 旅行车类,继承基础车类 * * @author * */ public class TravelCar extends Car { @Override public BigDecimal countRent1() { BigDecimal ret = null; ret = price .multiply(new BigDecimal("2").divide(new BigDecimal("1000"))); ret = ret.setScale(0, BigDecimal.ROUND_CEILING); return ret; } } package com.neusoft; import java.math.BigDecimal; /** * 越野车类,继承基础车类 * * @author * */ public class YueyeCar extends Car { @Override public BigDecimal countRent1() { BigDecimal ret = null; ret = price .multiply(new BigDecimal("3").divide(new BigDecimal("1000"))); ret = ret.setScale(0, BigDecimal.ROUND_CEILING); return ret; } }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值