BLOG2 航空货运系统题目8-9 总结
-
一·前言
历时两周,本次航空货运系统代码成功完成,主要考察了面向对象编程的四大原则:
1.单一职责原则(Single Responsibility Principle, SRP):一个类应该仅有一个引起它变化的原因(即一个类只负责一项职责)。
2.开闭原则(Open/Closed Principle, OCP):软件实体(类、模块、函数等)应该对扩展开放(即通过新增代码实现功能扩展),对修改关闭(即不修改已有代码逻辑)。
3.里氏替换原则(Liskov Substitution Principle, LSP):子类必须能够替换其父类,且程序的行为不变(子类需遵循父类的契约)。其中子类方法的前置条件(参数)不能比父类更严格,后置条件(返回值 / 异常)不能比父类更宽松。
4.合成复用原则(Composite Reuse Principle, CRP):优先使用组合(Composition)或聚合(Aggregation)而非继承来实现代码复用。
在前期设计基础上,进行类的设计,将人物、货物运输、订单等功能分类封装,让系统结构更清晰;后期则增加代码的可扩展性,增添抽象类的设计,将不同类型的人物类型、货物运输等功能借助继承特性实现系统的迭代,使系统能够轻松应对不同运输场景与业务需求的变化。
在第一阶段,航空货运系统的订单逻辑过于庞大,不知道该怎么设计类图,经过一周的思考,使后续的开发逐渐变得顺畅;在第二阶段的系统扩展中,通过第一次代码的继承,使得扩展更加容易,代码更灵活。这一过程让我明白,一个高效稳定的代码系统,需要继承与多态等多种特性、原则,才能分阶段、有条理、有层次地逐步实现。 -
二·设计与分析
1.第八次题目集
题目说明:
航空快递以速度快、安全性高成为急件或贵重物品的首选。本题目要求对航空货运管理系统进行类设计,具体说明参看说明文件。
题目说明
点击查看题目格式
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户编号
客户姓名
客户电话
客户地址
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
输出格式:
如果订单中货物重量超过航班剩余载重量,程序输出The flight with flight number:航班号 has exceeded its load capacity and cannot carry the order. ,程序终止运行。
如果航班载重量可以承接该订单,输出如下:
客户:姓名(电话)订单信息如下:
-----------------------------------------
航班号:
订单号:
订单日期:
发件人姓名:
发件人电话:
发件人地址:
收件人姓名:
收件人电话:
收件人地址:
订单总重量(kg):
微信支付金额:
货物明细如下:
-----------------------------------------
明细编号 货物名称 计费重量 计费费率 应交运费
1 ...
2 ...
注:输出中实型数均保留1位小数。
输入样例:
在这里给出一组输入。例如:
10001
郭靖
13807911234
南昌航空大学
2
101
发电机
80
60
40
80
102
信号发生器
55
70
60
45
MU1234
昌北国际机场
大兴国际机场
2025-04-22
1000
900001
2025-04-22
南昌大学
洪七公
18907912325
北京大学
黄药师
13607912546
输出样例:
在这里给出相应的输出。例如:
客户:郭靖(13807911234)订单信息如下:
-----------------------------------------
航班号:MU1234
订单号:900001
订单日期:2025-04-22
发件人姓名:洪七公
发件人电话:18907912325
发件人地址:南昌大学
收件人姓名:黄药师
收件人电话:13607912546
收件人地址:北京大学
订单总重量(kg):125.0
微信支付金额:3350.0
货物明细如下:
-----------------------------------------
明细编号 货物名称 计费重量 计费费率 应交运费
1 发电机 80.0 25.0 2000.0
2 信号发生器 45.0 30.0 1350.0
实际代码
点击查看代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入客户信息
String customerID = scanner.nextLine();
String customerName = scanner.nextLine();
String customerPhone = scanner.nextLine();
String customerAddress = scanner.nextLine();
// 输入货物信息
int goodsCount = Integer.parseInt(scanner.nextLine());
ArrayList<OrderItem> itemList=new ArrayList<OrderItem>();
for (int i = 1; i <= goodsCount; i++) {
int OrderItemID=i;
int productNum=1;
String productID = scanner.nextLine();
String productName = scanner.nextLine();
double width = Double.parseDouble(scanner.nextLine());
double length = Double.parseDouble(scanner.nextLine());
double hidth = Double.parseDouble(scanner.nextLine());
double weight = Double.parseDouble(scanner.nextLine());
Product product=new Product(productID,productName,width,length, hidth, weight);
OrderItem orderItem=new OrderItem(OrderItemID,product,productNum);
itemList.add(orderItem);
}
// 输入航班信息
String airID = scanner.nextLine();
String takeoffAirport = scanner.nextLine();
String landAirport = scanner.nextLine();
String flightDate = scanner.nextLine();
double maxCapacity = Double.parseDouble(scanner.nextLine());
Flight flight=new Flight(airID,takeoffAirport,landAirport,flightDate,maxCapacity);
// 输入订单信息
String orderID = scanner.nextLine();
String orderDate = scanner.nextLine();
String senderAddress = scanner.nextLine();
String senderName = scanner.nextLine();
String senderPhone = scanner.nextLine();
String receiverAddress = scanner.nextLine();
String receiverName = scanner.nextLine();
String receiverPhone = scanner.nextLine();
Order order=new Order(orderID,orderDate,
senderAddress,senderName,senderPhone,
receiverAddress,receiverName,receiverPhone,itemList);
LinkedList<Order> orderList=new LinkedList<>();
orderList.add(order);
OrderManage orderManage=new OrderManage(orderList);
Customer customer=new Customer(customerID,customerName,customerPhone,customerAddress,orderManage);
Payment payment=new WechatPay(customer.getOrderManage().getList().get(0).getTotalSum());
if (flight.getMaxCapacity()<customer.getOrderManage().getList().get(0).getTotalCostWeight()) {
System.out.println("The flight with flight number:"+ flight.getAirID() +" has exceeded its load capacity and cannot carry the order.");
System.exit(0);
}else {
// 打印客户信息
System.out.println("客户:" + customer.getName() + "(" + customer.getPhone() + ")订单信息如下:");
System.out.println("-----------------------------------------");
// 打印订单信息
System.out.println("航班号:" + flight.getAirID());
System.out.println("订单号:" + customer.getOrderManage().getList().get(0).getOrderID());
System.out.println("订单日期:" + customer.getOrderManage().getList().get(0).getDate());
System.out.println("发件人姓名:" + customer.getOrderManage().getList().get(0).getSenderName());
System.out.println("发件人电话:" + customer.getOrderManage().getList().get(0).getSenderPhone());
System.out.println("发件人地址:" + customer.getOrderManage().getList().get(0).getSenderAddress());
System.out.println("收件人姓名:" + customer.getOrderManage().getList().get(0).getReceiverName());
System.out.println("收件人电话:" + customer.getOrderManage().getList().get(0).getReceiverPhone());
System.out.println("收件人地址:" + customer.getOrderManage().getList().get(0).getReceiverAddress());
System.out.println("订单总重量(kg):" +customer.getOrderManage().getList().get(0).getTotalCostWeight());
customer.pay(payment);
System.out.print("\n");
// 打印货物明细
System.out.println("货物明细如下:");
System.out.println("-----------------------------------------");
System.out.println("明细编号 货物名称 计费重量 计费费率 应交运费");
for (OrderItem item : customer.getOrderManage().getList().get(0).getList()) {
System.out.println(item.getOrderItemID() + " "
+ item.getProduct().getName() + " "
+ item.getCostWeight() + " "
+ item.getRate() + " "
+ item.getPrice());
}
}
scanner.close();
}
}
class Customer {//顾客
private String customerID;
private String name;
private String phone;
private String address;
private OrderManage orderManage;
public Customer() {
}
public Customer(String customerID,String name,String phone,String address,OrderManage orderManage) {
this.address=address;
this.phone=phone;
this.name=name;
this.customerID=customerID;
this.orderManage=orderManage;
}
public String getCustomerID() {
return customerID;
}
public String getAddress() {
return address;
}
public String getPhone() {
return phone;
}
public void setAddress(String address) {
this.address = address;
}
public void setPhone(String phone) {
this.phone= phone;
}
public void setCustomerID(String customerID) {
this.customerID = customerID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public OrderManage getOrderManage() {
return orderManage;
}
public void setOrderManage(OrderManage orderManage) {
this.orderManage = orderManage;
}
public void addOrder(Order order) {
orderManage.addOrder(order);
}
public void pay(Payment payment) {
orderManage.pay(payment);
}
}
class OrderManage {//订单管理
private LinkedList<Order> list=new LinkedList<>();//订单
public OrderManage() {
}
public OrderManage(LinkedList<Order> list) {
this.list=list;
}
public LinkedList<Order> getList() {
return list;
}
public void setList(LinkedList<Order> list) {
this.list = list;
}
public void addOrder(Order order) {
list.add(order);
}
public void deleteOrder(Order order) {
list.remove(order);
}
public void pay(Payment payment) {
list.get(0).pay(payment);
}
}
class Order {//订单
private String orderID;//订单编号
private String date;//订单日期
private String senderAddress;//发件人地址
private String senderName;//发件人姓名
private String senderPhone;//发件人电话
private String receiverAddress;//收件人地址
private String receiverName;//收件人姓名
private String receiverPhone;//收件人电话
private ArrayList<OrderItem> list=new ArrayList<OrderItem>();//所有订单项
public Order() {
}
public Order( String orderID,
String date,
String senderAddress,
String senderName,
String senderPhone,
String receiverAddress,
String receiverName,
String receiverPhone,
ArrayList<OrderItem> list) {
this.date=date;
this.list=list;
this.orderID=orderID;
this.receiverAddress=receiverAddress;
this.receiverName=receiverName;
this.receiverPhone=receiverPhone;
this.senderAddress=senderAddress;
this.senderName=senderName;
this.senderPhone=senderPhone;
}
public String getDate() {
return date;
}
public ArrayList<OrderItem> getList() {
return list;
}
public String getOrderID() {
return orderID;
}
public String getReceiverAddress() {
return receiverAddress;
}
public String getReceiverName() {
return receiverName;
}
public String getReceiverPhone() {
return receiverPhone;
}
public String getSenderAddress() {
return senderAddress;
}
public String getSenderName() {
return senderName;
}
public String getSenderPhone() {
return senderPhone;
}
public void setDate(String date) {
this.date = date;
}
public void setList(ArrayList<OrderItem> list) {
this.list = list;
}
public void setOrderID(String orderID) {
this.orderID = orderID;
}
public void setReceiverAddress(String receiverAddress) {
this.receiverAddress = receiverAddress;
}
public void setReceiverName(String receiverName) {
this.receiverName = receiverName;
}
public void setReceiverPhone(String receiverPhone) {
this.receiverPhone = receiverPhone;
}
public void setSenderAddress(String senderAddress) {
this.senderAddress = senderAddress;
}
public void setSenderName(String senderName) {
this.senderName = senderName;
}
public void setSenderPhone(String senderPhone) {
this.senderPhone = senderPhone;
}
public double getTotalCostWeight() {//订单重量
double w = 0;
for (OrderItem item : list) {
w += item.getCostWeight();
}
return w;
}
public double getTotalSum() {//订单金额
double sum = 0;
for (OrderItem item : list) {
sum += item.getPrice();
}
return sum;
}
public void pay(Payment payment) {//支付
payment.pay();
}
}
class OrderItem {//订单项
private int OrderItemID;//明细编号(按顺序)
private int num;//产品数量
private Product product;//产品
private double rate;//利率
private double costWeight;//计费重量
private double price;//价格
public OrderItem() {
}
public OrderItem(int OrderItemID, Product product, int num) {
this.OrderItemID = OrderItemID;
this.product = product;
this.num = num;
this.costWeight = Math.max(product.getWeight(), product.getLength() * product.getHidth() * product.getWidth() / 6000);
if (costWeight < 20) {
rate = 35;
} else if (costWeight < 50) {
rate = 30;
} else if (costWeight < 100) {
rate = 25;
} else {
rate = 15;
}
this.price = costWeight * rate * num;
}
public int getNum() {
return num;
}
public double getPrice() {
price=costWeight*rate*num;
return price;
}
public int getOrderItemID() {
return OrderItemID;
}
public Product getProduct() {
return product;
}
public double getCostWeight() {
return costWeight;
}
public double getRate() {
return rate;
}
public void setNum(int num) {
this.num = num;
}
public void setOrderItemID(int orderItemID) {
OrderItemID = orderItemID;
}
public void setProduct(Product product) {
this.product = product;
}
public void setCostWeight(double costWeight) {
this.costWeight = costWeight;
}
public void setRate(double rate) {
this.rate = rate;
}
public void setPrice(double price) {
this.price = price;
}
}
class Product {
private String productID;//产品编号
private String name;//产品名字
private double width;//宽
private double length;//长
private double hidth;//高
private double weight;//实际重量
public Product() {
}
public Product(String productID,String name,double width, double length,double hidth,double weight) {
this.name=name;
this.productID=productID;
this.width=width;
this.length= length;
this.hidth= hidth;
this.weight= weight;
}
public String getName() {
return name;
}
public double getHidth() {
return hidth;
}
public double getLength() {
return length;
}
public double getWeight() {
return weight;
}
public double getWidth() {
return width;
}
public String getProductID() {
return productID;
}
public void setName(String name) {
this.name = name;
}
public void setProductID(String productID) {
this.productID = productID;
}
public void setHidth(double hidth) {
this.hidth = hidth;
}
public void setLength(double length) {
this.length = length;
}
public void setWeight(double weight) {
this.weight = weight;
}
public void setWidth(double width) {
this.width = width;
}
}
class Flight {
private String airID;//飞机号
private String takeoffAirport;//起飞机场
private String landAirport;//落地机场
private double maxCapacity;//最大载重量
private String date;//航班日期
public Flight(String airID,String takeoffAirport,String landAirport,String date,double maxCapacity) {
this.airID=airID;
this.date=date;
this.landAirport=landAirport;
this.maxCapacity=maxCapacity;
this.takeoffAirport=takeoffAirport;
}
public Flight() {
}
public String getAirID() {
return airID;
}
public String getDate() {
return date;
}
public String getLandAirport() {
return landAirport;
}
public double getMaxCapacity() {
return maxCapacity;
}
public String getTakeoffAirport() {
return takeoffAirport;
}
public void setAirID(String airID) {
this.airID = airID;
}
public void setDate(String date) {
this.date = date;
}
public void setLandAirport(String landAirport) {
this.landAirport = landAirport;
}
public void setMaxCapacity(double maxCapacity) {
this.maxCapacity = maxCapacity;
}
public void setTakeoffAirport(String takeoffAirport) {
this.takeoffAirport = takeoffAirport;
}
}
abstract class Payment {
public Payment(double amount) {
}
public void pay() {
}
}
class WechatPay extends Payment{//微信支付
private double amount;
public WechatPay(double amount) {
super(amount);
// TODO Auto-generated constructor stub
this.amount=amount;
}
public void pay() {
System.out.println("微信支付金额:"+amount);
}
}
class AliPay extends Payment{//支付宝支付
private double amount;
public AliPay(double amount) {
super(amount);
// TODO Auto-generated constructor stub
this.amount=amount;
}
public void pay() {
System.out.println("支付宝支付金额:"+amount);
}
}
具体类图

具体分析
点击查看
1. Customer类
• 属性:
customerID :客户编号。
name :客户姓名。
phone :客户电话。
address :客户地址。
orderManage :订单管理对象,用于管理客户的订单。
•方法:
addOrder(Order order) :为客户添加订单。
pay(Payment payment) :调用订单管理对象的支付功能。
2. OrderManage 类
• 属性:
list :订单列表,存储客户的订单。
• 方法:
addOrder(Order order) :添加订单到订单列表。
deleteOrder(Order order) :从订单列表中删除订单。
pay(Payment payment) :调用订单的支付功能。
3. Order 类
• 属性
orderID :订单编号。
date :订单日期。
senderAddress 、 senderName 、 senderPhone :发件人信息。
receiverAddress 、 receiverName 、 receiverPhone :收件人信息。
list :订单项列表,存储订单中的货物明细。
• 方法:
getTotalCostWeight() :计算订单的总重量。
getTotalSum() :计算订单的总金额。
pay(Payment payment) :调用支付方式的支付方法。
4. OrderItem 类
• 属性:
OrderItemID :订单项编号。
num :货物数量。
product :货物对象。
rate :计费费率。
costWeight :计费重量。
price :应交运费。
• 方法:
在构造函数中计算计费重量和计费费率,并根据这些值计算应交运费。
5. Product 类
• 属性:
productID :货物编号。
name :货物名称。
width 、 length 、 hidth :货物的宽、长、高。
weight :货物的实际重量。
• 方法:
提供了获取和设置货物属性的方法。
6. Flight 类
• 属性:
airID :航班号。
takeoffAirport :起飞机场。
landAirport :落地机场。
maxCapacity :最大载重量。
date :航班日期。
• 方法:
提供了获取和设置航班信息的方法。
7. Payment 类
抽象类
提供了一个抽象的支付方法 pay() ,具体实现由子类提供。
8. WechatPay 和 AliPay 类
继承自 Payment 类:
实现了具体的支付方式(微信支付和支付宝支付)。• 在 pay() 方法中输出支付金额。
报表

2.第九次题目集
题目说明:
航空快递以速度快、安全性高成为急件或贵重物品的首选。本题目要求对航空货运管理系统进行类设计,具体说明参看说明文件。
题目说明
实际代码
点击查看代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入客户信息
String customerType = scanner.nextLine();
String customerID = scanner.nextLine();
String customerName = scanner.nextLine();
String customerPhone = scanner.nextLine();
String customerAddress = scanner.nextLine();
// 输入货物信息
String productType= scanner.nextLine();
int goodsCount = Integer.parseInt(scanner.nextLine());
ArrayList<OrderItem> itemList=new ArrayList<OrderItem>();
if(goodsCount==0){
System.out.println("Wrong Format");
System.exit(0);}
for (int i = 1; i <= goodsCount; i++) {
int OrderItemID=i;
int productNum=1;
String productID = scanner.nextLine();
String productName = scanner.nextLine();
double width = Double.parseDouble(scanner.nextLine());
double length = Double.parseDouble(scanner.nextLine());
double hidth = Double.parseDouble(scanner.nextLine());
double weight = Double.parseDouble(scanner.nextLine());
Product product=null;
switch(productType) {
case "Normal":
product=new Normal(productID,productName,width,length, hidth, weight);
break;
case"Dangerous":
product=new Dangerous(productID,productName,width,length, hidth, weight);
break;
case"Expedite":
product=new Expedite(productID,productName,width,length, hidth, weight);
break;
}
OrderItem orderItem=new OrderItem(OrderItemID,product,productNum);
itemList.add(orderItem);
}
// 输入航班信息
String airID = scanner.nextLine();
String takeoffAirport = scanner.nextLine();
String landAirport = scanner.nextLine();
String flightDate = scanner.nextLine();
double maxCapacity = Double.parseDouble(scanner.nextLine());
Flight flight=new Flight(airID,takeoffAirport,landAirport,flightDate,maxCapacity);
// 输入订单信息
String orderID = scanner.nextLine();
String orderDate = scanner.nextLine();
String senderAddress = scanner.nextLine();
String senderName = scanner.nextLine();
String senderPhone = scanner.nextLine();
String receiverAddress = scanner.nextLine();
String receiverName = scanner.nextLine();
String receiverPhone = scanner.nextLine();
//输入支付方式
String payWay = scanner.nextLine();
Order order=new Order(orderID,orderDate,
senderAddress,senderName,senderPhone,
receiverAddress,receiverName,receiverPhone,itemList);
LinkedList<Order> orderList=new LinkedList<>();
orderList.add(order);
OrderManage orderManage=new OrderManage(orderList);
Customer customer=null;
switch(customerType) {
case "Individual":
customer=new Individual(customerID,customerName,customerPhone,customerAddress,orderManage);
break;
case"Corporate":
customer=new Corporate(customerID,customerName,customerPhone,customerAddress,orderManage);
break;
}
Payment payment=null;
switch(payWay) {
case "ALiPay":
payment=new ALiPay(customer.getPrice());
break;
case"Wechat":
payment=new WechatPay (customer.getPrice());
break;
case"Cash":
payment=new CashPay(customer.getPrice());
break;
}
if (flight.getMaxCapacity()<customer.getOrderManage().getList().get(0).getTotalCostWeight()) {
System.out.println("The flight with flight number:"+ flight.getAirID() +" has exceeded its load capacity and cannot carry the order.");
System.exit(0);
}else {
// 打印客户信息
System.out.println("客户:" + customer.getName() + "(" + customer.getPhone() + ")订单信息如下:");
System.out.println("-----------------------------------------");
// 打印订单信息
System.out.println("航班号:" + flight.getAirID());
System.out.println("订单号:" + customer.getOrderManage().getList().get(0).getOrderID());
System.out.println("订单日期:" + customer.getOrderManage().getList().get(0).getDate());
System.out.println("发件人姓名:" + customer.getOrderManage().getList().get(0).getSenderName());
System.out.println("发件人电话:" + customer.getOrderManage().getList().get(0).getSenderPhone());
System.out.println("发件人地址:" + customer.getOrderManage().getList().get(0).getSenderAddress());
System.out.println("收件人姓名:" + customer.getOrderManage().getList().get(0).getReceiverName());
System.out.println("收件人电话:" + customer.getOrderManage().getList().get(0).getReceiverPhone());
System.out.println("收件人地址:" + customer.getOrderManage().getList().get(0).getReceiverAddress());
System.out.println("订单总重量(kg):" +customer.getOrderManage().getList().get(0).getTotalCostWeight());
customer.pay(payment);
System.out.print("\n");
// 打印货物明细
System.out.println("货物明细如下:");
System.out.println("-----------------------------------------");
System.out.println("明细编号 货物名称 计费重量 计费费率 应交运费");
for (OrderItem item : customer.getOrderManage().getList().get(0).getList()) {
System.out.println(item.getOrderItemID() + " "
+ item.getProduct().getName() + " "
+ item.getCostWeight() + " "
+ item.getRate() + " "
+ item.getPrice());
}
}
scanner.close();
}
}
abstract class Product {
protected String productID;//产品编号
protected String name;//产品名字
protected double width;//宽
protected double length;//长
protected double hidth;//高
protected double weight;//实际重量
protected double rate;//利率
protected double costWeight;//计费重量
protected double price;//价格
public Product() {
}
public Product(String productID,String name,double width, double length,double hidth,double weight) {
this.name=name;
this.productID=productID;
this.width=width;
this.length= length;
this.hidth= hidth;
this.weight= weight;
}
public String getName() {
return name;
}
public double getHidth() {
return hidth;
}
public double getLength() {
return length;
}
public double getWeight() {
return weight;
}
public double getWidth() {
return width;
}
public String getProductID() {
return productID;
}
public void setName(String name) {
this.name = name;
}
public void setProductID(String productID) {
this.productID = productID;
}
public void setHidth(double hidth) {
this.hidth = hidth;
}
public void setLength(double length) {
this.length = length;
}
public void setWeight(double weight) {
this.weight = weight;
}
public void setWidth(double width) {
this.width = width;
}
public double getCostWeight() {
return Math.max(getWeight(), getLength() * getHidth() * getWidth() / 6000);
}
public double getPrice() {
return costWeight*getRate();
}
abstract double getRate() ;
public void setCostWeight(double costWeight) {
this.costWeight = costWeight;
}
public void setPrice(double price) {
this.price = price;
}
public void setRate(double rate) {
this.rate = rate;
}
}
class Dangerous extends Product{
public Dangerous(String productID, String name, double width, double length, double height, double weight) {
super(productID, name, width, length, height, weight);
}
@Override
double getRate() {
double cw=getCostWeight();
if(0<=cw&&cw<20) {
return 80;
}else if(cw<50) {
return 50;
}else if(cw<100) {
return 30;
}else {
return 20;
}
}
}
class Expedite extends Product{
public Expedite(String productID, String name, double width, double length, double height, double weight) {
super(productID, name, width, length, height, weight);
}
@Override
double getRate() {
double cw=getCostWeight();
if(0<=cw&&cw<20) {
return 60;
}else if(cw<50) {
return 50;
}else if(cw<100) {
return 40;
}else {
return 30;
}
}
}
class Normal extends Product{
public Normal(String productID, String name, double width, double length, double height, double weight) {
super(productID, name, width, length, height, weight);
}
@Override
double getRate() {
double cw=getCostWeight();
if(0<=cw&&cw<20) {
return 35;
}else if(cw<50) {
return 30;
}else if(cw<100) {
return 25;
}else {
return 15;
}
}
}
abstract class Payment {
protected double amount;
public Payment() {
}
public Payment(double amount) {
this.amount=amount;
}
abstract void pay(double amount) ;
}
class ALiPay extends Payment{
public ALiPay(double amount) {
super(amount);
}
@Override
void pay(double amount) {
System.out.println("支付宝支付金额:"+amount);
}
}
class CashPay extends Payment{
public CashPay(double amount) {
super(amount);
}
@Override
void pay(double amount) {
System.out.println("现金支付金额:"+amount);
}
}
class WechatPay extends Payment{
public WechatPay(double amount) {
super(amount);
}
@Override
void pay(double amount) {
System.out.println("微信支付金额:"+amount);
}
}
class OrderItem {
private int OrderItemID;//明细编号(按顺序)
private int num;//产品数量
private Product product;//产品
private double price;//价格
private double rate;
private double costWeight;
public OrderItem() {
}
public OrderItem(int OrderItemID, Product product, int num) {
this.OrderItemID = OrderItemID;
this.product = product;
this.num = num;
this.price =product.getCostWeight()* num*product.getRate();
}
public double getCostWeight() {
return product.getCostWeight();
}
public double getRate() {
return product.getRate();
}
public int getNum() {
return num;
}
public int getOrderItemID() {
return OrderItemID;
}
public Product getProduct() {
return product;
}
public double getPrice() {
return price;
}
public void setNum(int num) {
this.num = num;
}
public void setOrderItemID(int orderItemID) {
OrderItemID = orderItemID;
}
public void setProduct(Product product) {
this.product = product;
}
public void setPrice(double price) {
this.price = price;
}
}
class Order {
private String orderID;//订单编号
private String date;//订单日期
private String senderAddress;//发件人地址
private String senderName;//发件人姓名
private String senderPhone;//发件人电话
private String receiverAddress;//收件人地址
private String receiverName;//收件人姓名
private String receiverPhone;//收件人电话
private ArrayList<OrderItem> list=new ArrayList<OrderItem>();//所有订单项
public Order() {
}
public Order( String orderID,
String date,
String senderAddress,
String senderName,
String senderPhone,
String receiverAddress,
String receiverName,
String receiverPhone,
ArrayList<OrderItem> list) {
this.date=date;
this.list=list;
this.orderID=orderID;
this.receiverAddress=receiverAddress;
this.receiverName=receiverName;
this.receiverPhone=receiverPhone;
this.senderAddress=senderAddress;
this.senderName=senderName;
this.senderPhone=senderPhone;
}
public String getDate() {
return date;
}
public ArrayList<OrderItem> getList() {
return list;
}
public String getOrderID() {
return orderID;
}
public String getReceiverAddress() {
return receiverAddress;
}
public String getReceiverName() {
return receiverName;
}
public String getReceiverPhone() {
return receiverPhone;
}
public String getSenderAddress() {
return senderAddress;
}
public String getSenderName() {
return senderName;
}
public String getSenderPhone() {
return senderPhone;
}
public void setDate(String date) {
this.date = date;
}
public void setList(ArrayList<OrderItem> list) {
this.list = list;
}
public void setOrderID(String orderID) {
this.orderID = orderID;
}
public void setReceiverAddress(String receiverAddress) {
this.receiverAddress = receiverAddress;
}
public void setReceiverName(String receiverName) {
this.receiverName = receiverName;
}
public void setReceiverPhone(String receiverPhone) {
this.receiverPhone = receiverPhone;
}
public void setSenderAddress(String senderAddress) {
this.senderAddress = senderAddress;
}
public void setSenderName(String senderName) {
this.senderName = senderName;
}
public void setSenderPhone(String senderPhone) {
this.senderPhone = senderPhone;
}
public double getTotalCostWeight() {
double w = 0;
for (OrderItem item : list) {
w += item.getProduct().getCostWeight();
}
return w;
}
public double getTotalSum() {
double sum = 0;
for (OrderItem item : list) {
sum += item.getPrice();
}
return sum;
}
}
class OrderManage {
private LinkedList<Order> list=new LinkedList<>();//订单
public OrderManage() {
}
public OrderManage(LinkedList<Order> list) {
this.list=list;
}
public LinkedList<Order> getList() {
return list;
}
public void setList(LinkedList<Order> list) {
this.list = list;
}
public void addOrder(Order order) {
list.add(order);
}
public void deleteOrder(Order order) {
list.remove(order);
}
}
abstract class Customer {
protected String customerID;
protected String name;
protected String phone;
protected String address;
protected OrderManage orderManage;
protected double discount;
public Customer() {
}
public Customer(String customerID,String name,String phone,String address,OrderManage orderManage) {
this.address=address;
this.phone=phone;
this.name=name;
this.customerID=customerID;
this.orderManage=orderManage;
this.discount=getDiscount();
}
abstract double getDiscount() ;
public void setDiscount(double discount) {
this.discount = discount;
}
public String getCustomerID() {
return customerID;
}
public String getAddress() {
return address;
}
public String getPhone() {
return phone;
}
public void setAddress(String address) {
this.address = address;
}
public void setPhone(String phone) {
this.phone= phone;
}
public void setCustomerID(String customerID) {
this.customerID = customerID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public OrderManage getOrderManage() {
return orderManage;
}
public void setOrderManage(OrderManage orderManage) {
this.orderManage = orderManage;
}
public void addOrder(Order order) {
orderManage.addOrder(order);
}
abstract double getPrice();
abstract void pay(Payment payment) ;
}
class Corporate extends Customer{
public Corporate(String customerID, String name, String phone, String address, OrderManage orderManage) {
super(customerID, name, phone, address, orderManage);
}
@Override
double getPrice() {
return getOrderManage().getList().get(0).getTotalSum() * getDiscount();
}
@Override
void pay(Payment payment) {
payment.pay(getPrice());
}
@Override
double getDiscount() {
discount=0.8;
return discount;
}
}
class Individual extends Customer {
public Individual(String customerID, String name, String phone, String address, OrderManage orderManage) {
super(customerID, name, phone, address, orderManage);
}
@Override
double getPrice() {
return getOrderManage().getList().get(0).getTotalSum() * getDiscount();
}
@Override
void pay(Payment payment) {
payment.pay(getPrice());
}
@Override
double getDiscount() {
discount=0.9;
return discount;
}
}
class Flight {
private String airID;//飞机号
private String takeoffAirport;//起飞
private String landAirport;//落地
private double maxCapacity;//最大载重量
private String date;//航班日期
public Flight(String airID,String takeoffAirport,String landAirport,String date,double maxCapacity) {
this.airID=airID;
this.date=date;
this.landAirport=landAirport;
this.maxCapacity=maxCapacity;
this.takeoffAirport=takeoffAirport;
}
public Flight() {
}
public String getAirID() {
return airID;
}
public String getDate() {
return date;
}
public String getLandAirport() {
return landAirport;
}
public double getMaxCapacity() {
return maxCapacity;
}
public String getTakeoffAirport() {
return takeoffAirport;
}
public void setAirID(String airID) {
this.airID = airID;
}
public void setDate(String date) {
this.date = date;
}
public void setLandAirport(String landAirport) {
this.landAirport = landAirport;
}
public void setMaxCapacity(double maxCapacity) {
this.maxCapacity = maxCapacity;
}
public void setTakeoffAirport(String takeoffAirport) {
this.takeoffAirport = takeoffAirport;
}
}
具体类图

具体分析
点击查看
1. Product 抽象类
• 属性
productID :产品编号。
name :产品名称。
width 、 length 、 hidth :产品的宽、长、高。
weight :产品的实际重量。
rate :计费费率。
costWeight :计费重量。
price :价格。
• 方法
getCostWeight() :计算计费重量。
getPrice() :计算价格。
getRate() :抽象方法,由子类实现,根据计费重量返回不同的费率。
2. Product 的子类
• Normal 类
• 普通货物的费率
计算逻辑:
计费重量 < 20kg:费率 = 35。
20kg ≤ 计费重量 < 50kg:费率 = 30。
50kg ≤ 计费重量 < 100kg:费率 = 25。
计费重量 ≥ 100kg:费率 = 15。
• Dangerous 类
• 危险品的费率计算逻辑:
计费重量 < 20kg:费率 = 80。
20kg ≤ 计费重量 < 50kg:费率 = 50。
50kg ≤ 计费重量 < 100kg:费率 = 30。
计费重量 ≥ 100kg:费率 = 20。
• Expedite 类
• 急件的费率计算逻辑:
计费重量 < 20kg:费率 = 60。
20kg ≤ 计费重量 < 50kg:费率 = 50。
50kg ≤ 计费重量 < 100kg:费率 = 40。
计费重量 ≥ 100kg:费率 = 30。
3. OrderItem 类
• 属性
OrderItemID :货物明细编号。
num :产品数量。
product :对应的产品对象。
price :该明细的总价格。
• 方法
getCostWeight() :获取产品计费重量。
getRate() :获取产品计费费率。
getPrice() :计算该明细的总价格。
4. Order 类
• 属性
orderID :订单编号。
date :订单日期。
senderAddress 、 senderName 、 senderPhone :发件人信息。
receiverAddress 、 receiverName 、 receiverPhone :收件人信息。
list :订单中的所有货物明细。
• 方法
getTotalCostWeight() :计算订单总重量。
getTotalSum() :计算订单总金额。
5. OrderManage 类
• 属性
list :订单列表。
• 方法
addOrder(Order order) :添加订单。
deleteOrder(Order order) :删除订单。
6. Customer 抽象类
• 属性
customerID :客户编号。
name :客户名称。
phone :客户电话。
address :客户地址。
orderManage :客户管理的订单列表。
discount :折扣率。
• 方法
getPrice() :计算订单总金额(考虑折扣)。
pay(Payment payment) :支付订单金额。
getDiscount() :抽象方法,返回折扣率。
7. Customer 的子类
• Individual 类
个人客户的折扣率为 0.9。
• Corporate 类
企业客户的折扣率为 0.8。
8. Payment 抽象类
• 属性
amount :支付金额。
• 方法
pay(double amount) :抽象方法,由子类实现。
• 子类
• ALiPay 类
支付宝支付,输出支付金额。
• WechatPay 类
微信支付,输出支付金额。
• CashPay 类
现金支付,输出支付金额。
9. Flight 类
• 属性
airID :航班编号。
takeoffAirport :起飞机场。
landAirport :落地机场。
date :航班日期。
maxCapacity :最大载重量。
• 方法
提供了 get 和 set 方法,用于访问和修改属性。
报表

- 三·踩坑心得
(1)第八次题目集
1.代码运行逻辑的考虑:刚开始看到题目要求后便不知道如何下手,对于订单逻辑不了解,后来将订单、订单项、订单条目的含义进行比对,才设计好具体类图。
解决方法:具体理解题目词组含义。
2.输入方式的使用:在输入具体数据时,nextInt()、nextDouble()和nextLine()发生冲突,前者不消耗换行符,后者读取换行符,所有导致输出时出现问题。
解决方法:提前准备nextLine()来消耗换行符。
3.ArrayList的正确使用:对于在使用ArrayList时,发现在最终结果输出后所得的具体金额、总重和支付方法pay()上输出为0;后来经过检查才发现在Order类中采用remove方式将ArrayList中数据删去了。
解决方法:采用for(ArrayList i:ArrayList origin)方法替代原方法。
4.代码注释问题:只有属性添加了注释,但此次题目无较为复杂的方式。
解决方法:增加注释。
(2)第九次题目集
1.抽象类的正确使用:对于在新题目的抽象类,刚开始直接将代码复制,连构造类也是,使代码冗杂,后来将继承的父类改造,使子类的抽象类被继承。
解决方法:采用super()方法替代构造方法。
2.代码注释问题:只有属性添加了注释,但此次题目无较为复杂的方式。
解决方法:增加注释。
3.细节:在运行后,发现得到的具体输出数据错误,经过排查发现是计算总金额时未乘Rate;同时在继承的抽象类中发现Rate的范围设置错误。
解决方法:细心排查。
-
四·总结
这次航空货运管理系统,总体来说,没有复杂的运行逻辑,难度与上一次电梯类相比减小了不少。
经过这两次大作业的磨炼,我的编程水平有了不小的提升。但仍有不少需要改进的地方。例如代码冗余问题,有部分类内容重复,同时还有一些未调用的函数;以及对异常输入进行处理等等。不过正是这些不足之处,使得我明确了接下来需要学习的内容:比如学习更多的设计模式,以此来设计类图,让代码具备更高的灵活性,再比如学习单元测试方面的知识,从而更好查找错误,让代码的可靠性得以提升。

浙公网安备 33010602011771号