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);
}
}


具体类图
image

具体分析

点击查看
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()   方法中输出支付金额。

报表
image

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;
	}
	
}

具体类图
image

具体分析

点击查看
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   方法,用于访问和修改属性。

报表
image

  • 三·踩坑心得
    (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的范围设置错误。
解决方法:细心排查。

  • 四·总结

    这次航空货运管理系统,总体来说,没有复杂的运行逻辑,难度与上一次电梯类相比减小了不少。
    经过这两次大作业的磨炼,我的编程水平有了不小的提升。但仍有不少需要改进的地方。例如代码冗余问题,有部分类内容重复,同时还有一些未调用的函数;以及对异常输入进行处理等等。不过正是这些不足之处,使得我明确了接下来需要学习的内容:比如学习更多的设计模式,以此来设计类图,让代码具备更高的灵活性,再比如学习单元测试方面的知识,从而更好查找错误,让代码的可靠性得以提升。

posted @ 2025-05-25 19:28  Dazx  阅读(21)  评论(0)    收藏  举报