目标: 多态的设计应用及实现.
汽车出租商准备根据汽车购买的价格及汽车种类来制定
各种汽车的每日租金.
具体规则如下:
家用轿车: 购买价格 * (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;
}
}