哒哒租车系统
细细看了6-1的需求之后耗时3.5h将功能写出,然后又花费1.5h解耦合和其他小优化便于日后维护以及扩展新功能
基本思想:
- 多态的使用。利用多态,尽可能让代码更加清晰。多态的基本使用:继承-重写-向上转型。这个案例多态主要用在属性以及pri()方法上:建立Car[]数组(引用指向子类对象,向上转型),然后可以利用此数组直接去访问id等父类属性,实现统一处理;另外子类对象中已重写父类重新方法pri(),通过Car[]数组(向上转型),遍历调用pri()方法即可实现可租车型信息输出。
- 解耦合,实现一个类的功能尽可能的明朗。如主函数类Car_RentSystem,其中主函数只有一条语句,实例化一个Car_RentSystem对象,功能调用放在其构造方法中。功能实现的主要语句分离到Car_Admin类中,日后如需扩展功能,可直接在此类中进行而无须对更改主函数所在类以及Car类
Car类
package rent_car_system;
public abstract class Car {
/**
* 车型常用属性:id,name,price,cargo_capacity,passenger_capacity
*/
int id = 0;
String name = null;
int price = 0;
int cargo_capacity = 0;
int passenger_capacity = 0;
/**
*构造方法,用于类的初始化
*/
public void Car(int id, String name, int price, int passenger_capacity, int cargo_capacity) {
this.id = id;
this.name = name;
this.price = price;
this.passenger_capacity = passenger_capacity;
this.cargo_capacity = cargo_capacity;
}
/**
* 提供抽象方法,当子类向上转型时,可以调用各自的重写方法
* 实现多态步骤:1.继承;2.重写;3向上转型
*/
public abstract void pri();
}
/**
* 载客车型类,重写pri()方法,向上转型后可实现多态
*/
class Passenger_Car extends Car {
public Passenger_Car(int id, String name, int price, int capacity) {
super.Car(id, name, price, capacity, 0);
}
public void pri(){
System.out.println(id + "\t" + name + "\t" + price + " 元/天\t" + passenger_capacity + "人\t");
}
}
class Cargo_Car extends Car {
public Cargo_Car(int id, String name, int price, int capacity) {
super.Car(id, name, price, 0, capacity);
}
public void pri(){
System.out.println(id + "\t" + name + "\t" + price + " 元/天\t" + cargo_capacity + "吨\t");
}
}
class Pickup_Car extends Car {
public Pickup_Car(int id, String name, int price, int passenger_capacity, int cargo_capacity) {
super.Car(id, name, price, passenger_capacity, cargo_capacity);
}
public void pri(){
System.out.println(id + "\t" + name + "\t" + price + " 元/天\t" +
passenger_capacity + "人\t" + "&\t" + cargo_capacity + "吨\t");
}
}
管理系统功能实现类
package rent_car_system;
import java.util.Scanner;
/**
* 供应商初始化可租车型,并输出可祖列表
*/
class Car_Admin{
int sum_passenger=0;
int sum_cargo=0;
int sum_price=0;
StringBuilder pri_passenger=new StringBuilder();
StringBuilder pri_cargo=new StringBuilder();
Scanner scanner = new Scanner(System.in);
public Car[] Car_message(){
/**
* 向上转型,使其可以调用父类Car的属性,如id等,父类方法
*/
Car[] cars = {
new Passenger_Car(1, "奥 迪", 500, 4),
new Passenger_Car(2, "马自达", 400, 6),
new Pickup_Car(3,"皮 卡",450,4,4),
new Passenger_Car(4, "金 龙", 800, 15),
new Cargo_Car(5, "松花江", 400, 10),
new Cargo_Car(6, "依维柯", 1000, 20)
};
System.out.println("你可租车的类型及价目表");
System.out.println("ID 汽车品牌 价格 容量");
for (int i=0;i<cars.length;i++) {
cars[i].pri();
}
return cars;
}
/**
* 系统处理用户搭配信息,并输出明细
* @param cars 租车信息
*/
public void car_admin_function(Car[] cars){
//客户自由选择数量和车型
System.out.println("请输入你要租的汽车数量:");
int number=scanner.nextInt();
for(int i=0;i<number;i++){
System.out.println("请输入第"+(i+1)+"辆车的序号");
int id=scanner.nextInt();
//由于载货车型的载人容量已初始化为0(其他也如此),故直接相加即为所求
sum_passenger+=cars[id-1].passenger_capacity;
sum_cargo+=cars[id-1].cargo_capacity;
sum_price+=cars[id-1].price;
//如果是载客车型,则添加至字符串尾部
if (cars[id-1].passenger_capacity>0) {
pri_passenger.append(cars[id-1].name+"\t");
}
//如果是载货车型,则添加至字符串尾部
if (cars[id-1].cargo_capacity >0) {
pri_cargo.append(cars[id-1].name+"\t");
}
}
//此部分语句功能为明细输出
System.out.println("----------租车明细表----------");
System.out.println("载客类型:"+pri_passenger+"\n共载人:"+sum_passenger+"人");
System.out.println("载货类型:"+pri_cargo+"\n共载货:"+sum_cargo+"吨");
System.out.println("----------------------------");
//调用同类中的方法,计算总价格
this.price_bill(sum_price);
}
/**
* 输入天数后,即可计算总价格=天数*每天的租金
* @param sum_price
*/
public void price_bill(int sum_price){
System.out.println("请输入你要租的天数:");
int days=scanner.nextInt();
System.out.println("-----租车总价格-----");
System.out.println("您的租车费用为:"+days*sum_price+"元");
}
}
主函数类
package rent_car_system;
import java.util.Scanner;
/**
* <p><b>幕课网基础教程的习题</b></p>
* <p>租车系统,还需要对此系统进行再优化</p>
*/
public class Car_RentSystem {
Scanner scanner = new Scanner(System.in);
/**
* 程序入口
* @param args
*/
public static void main(String[] args) {
Car_RentSystem car_rentSystem = new Car_RentSystem();
}
/**
* 提供租车系统主体管理功能
*/
public Car_RentSystem() {
System.out.println("-----欢迎使用哒哒租车系统-----");
System.out.println("是否要租车:输入'Y'进入系统");
//建立死循环,当用户不想租车或已选定方案时跳出循环
/**
* TODO:if语句块中的内容为可扩展项(其他部分均为框架),思考如何将此部分分离出来,降低耦合性??
*/
while (true) {
if (scanner.next().equals("Y")) {
//初始化系统,展示可选车型等信息
Car_Admin car_admin = new Car_Admin();
Car[] cars = car_admin.Car_message();
//提供租车数量选择功能,并打印出租车明细表及总价格
car_admin.car_admin_function(cars);
} else {
//安全退出此系统
System.out.println("稍后退出系统,感谢您的使用");
System.exit(0);
}
System.out.println();
System.out.println("查看其他搭配及价格?输入'N'退出系统");
if(scanner.next().equals("N")){
break;
}
}
}
}
执行结果如下所示:
/usr/lib/jvm/java-12-oracle/bin/java -javaagent:/opt/idea/idea-IC-192.5728.98/lib/idea_rt.jar=41569:/opt/idea/idea-IC-192.5728.98/bin -Dfile.encoding=UTF-8 -classpath /home/yq/IdeaProjects/out/production/SortCollection:/opt/idea/idea-IC-192.5728.98/plugins/Kotlin/kotlinc/lib/kotlin-stdlib.jar:/opt/idea/idea-IC-192.5728.98/plugins/Kotlin/kotlinc/lib/kotlin-reflect.jar:/opt/idea/idea-IC-192.5728.98/plugins/Kotlin/kotlinc/lib/kotlin-test.jar:/opt/idea/idea-IC-192.5728.98/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-jdk7.jar:/opt/idea/idea-IC-192.5728.98/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-jdk8.jar rent_car_system.Car_RentSystem
-----欢迎使用哒哒租车系统-----
是否要租车:输入'Y'进入系统
Y
你可租车的类型及价目表
ID 汽车品牌 价格 容量
1 奥 迪 500 元/天 4人
2 马自达 400 元/天 6人
3 皮 卡 450 元/天 4人 & 4吨
4 金 龙 800 元/天 15人
5 松花江 400 元/天 10吨
6 依维柯 1000 元/天 20吨
请输入你要租的汽车数量:
3
请输入第1辆车的序号
1
请输入第2辆车的序号
2
请输入第3辆车的序号
3
----------租车明细表----------
载客类型:奥 迪 马自达 皮 卡
共载人:14人
载货类型:皮 卡
共载货:4吨
----------------------------
请输入你要租的天数:
3
-----租车总价格-----
您的租车费用为:4050元
查看其他搭配及价格?输入'N'退出系统
热门评论
写得好