時隔一年,再次嘗試實現一下,一年后再來看看是否有所長進。。。
類圖
演示效果:
源代碼
Car
/** ?*?車的基類,封裝通用屬性 ?*/ public?class?Car?{?//定義父類 ????private?int?id;?//編號 ????private?String?name;?//名字 ????private?float?price;?//價格 ????//定義構造方法 ????public?Car(int?id,?String?name,?float?price)?{ ????????this.id?=?id; ????????this.name?=?name; ????????this.price?=?price; ????} ????public?int?getId()?{ ????????return?id; ????} ????public?String?getName()?{ ????????return?name; ????} ????public?float?getPrice()?{ ????????return?price; ????} }
CargoCapacity
/** ?*?載貨能力接口 ?*/ public?interface?CargoCapacity?{ ????//?獲取載貨量 ????float?getWeight(); }
MannedCapacity
/** ?*?載人能力接口 ?*/ public?interface?MannedCapacity?{ ????//?獲取載人數 ????int?getNumber(); }
CargoCar
/** ?*?載貨汽車 ?*/ public?class?CargoCar?extends?Car?implements?CargoCapacity?{ ????private?float?weight;?//?載貨量 ????public?CargoCar(int?id,?String?name,?float?price,?float?weight)?{ ????????super(id,?name,?price); ????????this.weight?=?weight; ????} ????@Override ????public?float?getWeight()?{ ????????return?this.weight; ????} ????@Override ????public?String?toString()?{ ????????return?this.getId()?+?"\t"?+?this.getName()?+?"\t?"?+?this.getPrice()?+?"元/天\t載貨:"?+?getWeight()?+?"噸"; ????} }
MannedCar
/** ?*?載人汽車 ?*/ public?class?MannedCar?extends?Car?implements?MannedCapacity?{ ????private?int?number;?//?載人數 ????public?MannedCar(int?id,?String?name,?float?price,?int?number)?{ ????????super(id,?name,?price); ????????this.number?=?number; ????} ????@Override ????public?int?getNumber()?{ ????????return?this.number; ????} ????@Override ????public?String?toString()?{ ????????return?this.getId()?+?"\t"?+?this.getName()?+?"\t?"?+?this.getPrice()?+?"元/天\t載人:"?+?this.getNumber()?+?"人"; ????} }
MannedCargoCar
/** ?*?可同時載人和載貨的汽車 ?*/ public?class?MannedCargoCar?extends?Car?implements?MannedCapacity,?CargoCapacity?{ ????private?int?number;?//?裁人數 ????private?float?weight;?//?載貨數 ????public?MannedCargoCar(int?id,?String?name,?float?price,?int?number,?float?weight)?{ ????????super(id,?name,?price); ????????this.number?=?number; ????????this.weight?=?weight; ????} ????@Override ????public?int?getNumber()?{ ????????return?this.number; ????} ????@Override ????public?float?getWeight()?{ ????????return?this.weight; ????} ????@Override ????public?String?toString()?{ ????????return?this.getId()?+?"\t"?+?this.getName()?+?"\t?"?+?this.getPrice()?+?"元/天\t載人:"?+?getNumber()?+?"人\t載貨:"?+?getWeight()?+?"噸"; ????} }
CarManager
import?java.util.ArrayList; import?java.util.List; /** ?*?Car管理類 ?*/ public?class?CarManager?{ ????private?List<Car>?cars?=?new?ArrayList<>(); ????public?CarManager()?{ ????????init(); ????} ????//初始化Car集合 ????private?void?init()?{ ????????add(new?MannedCar(getCarId(),?"奧迪A4",?500,?4)); ????????add(new?MannedCar(getCarId(),?"馬自達6",?400,?4)); ????????add(new?MannedCargoCar(getCarId(),?"皮卡雪6",?450,?4,?2)); ????????add(new?MannedCar(getCarId(),?"金龍",?800,?20)); ????????add(new?CargoCar(getCarId(),?"松花江",?400,?4)); ????????add(new?CargoCar(getCarId(),?"依維柯",?1000,?20)); ????} ????public?void?add(Car?car)?{ ????????cars.add(car); ????} ????//菜單顯示 ????public?void?showMenu()?{ ????????System.out.println("========可租車的類型及其價目表========"); ????????System.out.println("序號\t"?+?"汽車名稱???"?+?"租金\t\t??"?+?"容量"); ????????cars.forEach(System.out::println); ????} ????public?Car?get(int?index)?{ ????????return?cars.get(index?-?1); ????} ????public?boolean?hasIndex(Integer?carId)?{ ????????return?carId?>?0?&&?carId?<=?cars.size(); ????} ????private?int?getCarId()?{ ????????return?cars.size()?+?1; ????} }
RentalItem
/** ?*?租賃項,每選擇租賃一種車都對應一個RentalItem ?*/ public?class?RentalItem?{ ????private?Integer?id; ????private?Car?car;?//?租賃的汽車 ????private?Integer?days;?//?租賃天數 ????private?Integer?quantity;?//?租賃數量 ????public?RentalItem(Car?car,?Integer?days,?Integer?quantity)?{ ????????this.car?=?car; ????????this.days?=?days; ????????this.quantity?=?quantity; ????????this.id?=?car.getId(); ????} ????public?float?getRent()?{ ????????return?this.car.getPrice()?*?this.days?*?this.quantity; ????} ????public?int?getNumber()?{ ????????if?(isMannedCar())?{ ????????????return?((MannedCapacity)?car).getNumber(); ????????} ????????return?0; ????} ????public?float?getWeight()?{ ????????if?(isCargoCar())?{ ????????????return?((CargoCapacity)?car).getWeight(); ????????} ????????return?0; ????} ????public?boolean?isMannedCar()?{ ????????return?car?instanceof?MannedCapacity; ????} ????public?boolean?isCargoCar()?{ ????????return?car?instanceof?CargoCapacity; ????} ????public?String?getName()?{ ????????return?car.getName(); ????} ????public?Integer?getId()?{ ????????return?id; ????} ????public?void?setDays(Integer?days)?{ ????????this.days?=?days; ????} ????public?void?setQuantity(Integer?quantity)?{ ????????this.quantity?=?quantity; ????} ????public?Integer?getDays()?{ ????????return?days; ????} ????public?Integer?getQuantity()?{ ????????return?quantity; ????} }
RentalBill
import?java.util.HashMap; import?java.util.List; import?java.util.Map; import?java.util.function.Function; import?java.util.stream.Collectors; /** ?*?租賃清單 ?*/ public?class?RentalBill?{ ????private?Map<Integer,?RentalItem>?itemMap?=?new?HashMap<>(); ????public?void?add(RentalItem?item)?{ ????????if?(itemMap.containsKey(item.getId()))?{ ????????????RentalItem?existItem?=?itemMap.get(item.getId()); ????????????existItem.setDays(existItem.getDays()?+?item.getDays()); ????????????existItem.setQuantity(existItem.getQuantity()?+?item.getQuantity()); ????????}?else?{ ????????????itemMap.put(item.getId(),?item); ????????} ????} ????public?void?showBill()?{ ????????System.out.println("=============您的賬單============="); ????????System.out.println("***可載人的車有:"?+?"\n\t"?+?mannedCarNames()?+?"?共載人:"?+?totalNumber()?+?"人"); ????????System.out.println("***可載貨的車有:"?+?"\n\t"?+?cargoCarNames()?+?"?共載貨:"?+?totalWeight()?+?"噸"); ????????System.out.println("***租車總價格:"?+?totalRent()?+?"元"); ????} ????private?List<String>?mannedCarNames()?{ ????????return?getCarNames(RentalItem::isMannedCar); ????} ????private?List<String>?cargoCarNames()?{ ????????return?getCarNames(RentalItem::isCargoCar); ????} ????private?List<String>?getCarNames(Function<RentalItem,?Boolean>?condition)?{ ????????return?itemMap.values().stream().filter(item?->?condition.apply(item)).map(RentalItem::getName).collect(Collectors.toList()); ????} ????private?Integer?totalNumber()?{ ????????return?itemMap.values().stream().filter(RentalItem::isMannedCar).map(RentalItem::getNumber).reduce(Integer::sum).get(); ????} ????private?Float?totalWeight()?{ ????????return?itemMap.values().stream().filter(RentalItem::isCargoCar).map(RentalItem::getWeight).reduce(Float::sum).get(); ????} ????private?Float?totalRent()?{ ????????return?itemMap.values().stream().map(RentalItem::getRent).reduce(0f,?(sum,?rent)?->?sum?+=?rent); ????} }
CarRentalSystem
import?java.util.Scanner; import?java.util.function.Function; /** ?*?租車系統 ?*/ public?class?CarRentalSystem?{ ????private?Scanner?scanner?=?new?Scanner(System.in); ????private?RentalBill?rentalBill?=?new?RentalBill(); ????private?CarManager?carManager?=?new?CarManager(); ????public?void?launch()?{ ????????System.out.println("歡迎使用答答租車系統:"); ????????if?(goOn())?{ ????????????showMenu(); ????????????collectRentalItems(); ????????????showBill(); ????????}?else?{ ????????????System.out.println("謝謝使用!客官慢走!"); ????????} ????} ????/** ?????*?顯示菜單 ?????*/ ????private?void?showMenu()?{ ????????carManager.showMenu(); ????} ????/** ?????*?顯示租賃清單 ?????*/ ????private?void?showBill()?{ ????????rentalBill.showBill(); ????} ????/** ?????*?收集用戶選擇的租賃信息 ?????*/ ????private?void?collectRentalItems()?{ ????????while?(true)?{ ????????????//?獲取車輛序號 ????????????int?carId?=?getInputCarId(); ????????????Car?car?=?carManager.get(carId); ????????????//?獲取租賃數量 ????????????int?quantity?=?getInputQuantity(car.getName()); ????????????//?獲取租賃天數 ????????????int?days?=?getInputDays(car.getName()); ????????????rentalBill.add(new?RentalItem(car,?days,?quantity)); ????????????System.out.print("是否選擇繼續租賃操作?(n:退出,并打印租賃清單;其他任意鍵繼續):"); ????????????String?input?=?scanner.next(); ????????????if?("N".equalsIgnoreCase(input.trim()))?{ ????????????????break; ????????????} ????????} ????} ????private?boolean?goOn()?{ ????????int?key?=?getInput("您是否要租車?(1是?0否):",?input?->?{ ????????????if?(input?!=?0?&&?input?!=?1)?{ ????????????????System.out.println("請輸入數字1或0!"); ????????????????return?false; ????????????} ????????????return?true; ????????}); ????????return?key?==?1; ????} ????private?int?getInputDays(String?name)?{ ????????return?getInput("請輸入["+name+"]的租賃天數:",?days?->?{ ????????????if?(days?<?1)?{ ????????????????System.out.println("不合法的租賃天數,請重新輸入!"); ????????????????return?false; ????????????} ????????????return?true; ????????}); ????} ????private?int?getInputQuantity(String?name)?{ ????????return?getInput("請輸入["+name+"]的租賃數量:",?quantity?->?{ ????????????if?(quantity?<?1?)?{ ????????????????System.out.println("不合法的租賃數量,請重新輸入!"); ????????????????return?false; ????????????} ????????????return?true; ????????}); ????} ????private?int?getInputCarId()?{ ????????return?getInput("請輸入要租賃的車輛序號:",?carId?->?{ ????????????if?(!carManager.hasIndex(carId))?{ ????????????????System.out.println("不合法的車輛序號,請重新輸入!"); ????????????????return?false; ????????????} ????????????return?true; ????????}); ????} ????/** ?????*?從控制臺接受用戶輸入的一個正整數 ?????* ?????*?@param?hint?????提示信息 ?????*?@param?function?用戶判斷用戶輸入的信息是否合法,如果不合法,需要重新輸入 ?????*?@return ?????*/ ????private?int?getInput(String?hint,?Function<Integer,?Boolean>?function)?{ ????????while?(true)?{ ????????????System.out.print(hint); ????????????try?{ ????????????????int?input?=?scanner.nextInt(); ????????????????if?(!function.apply(input))?{ ????????????????????continue; ????????????????} ????????????????return?input; ????????????}?catch?(Exception?e)?{ ????????????????System.out.println("輸入不合法!請重新輸入!"); ????????????????//?如果出現異常,則跳過本次輸入的信息 ????????????????scanner?=?scanner.skip(".*"); ????????????} ????????} ????} }
Test
/** ?*?啟動類 ?*/ public?class?Test?{ ????public?static?void?main(String[]?args)?{ ????????new?CarRentalSystem().launch(); ????} }
2020-12-21
類圖用什么畫的?