关于航空货运管理系统程序作业的想法和总结

一、前言:

在本轮题集中,第8次题集进行了航空货运管理系统的初步类设计,考察了继承和抽象类的相关内容;第9次题集则主要侧重于考察继承与多态的运用,通过继承和多态实现程序的可扩展性。总而言之,本轮题集的题量不大,重点在于对继承和多态方面知识的运用,以增强我们写出代码的可拓展性


二、设计与分析:

题集8第一次航空货运管理系统迭代:

点击查看题目
航空快递以速度快、安全性高成为急件或贵重物品的首选。本题目要求对航空货运管理系统进行类设计,具体说明参看说明文件。
OO第九周作业题目说明.pdf

输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。

客户编号
客户姓名
客户电话
客户地址
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
点击查看代码
import java.util.Scanner;
import java.util.LinkedList;

class People {
    private String name;
    private String phone;
    private String address;

    public People(String name, String phone, String address) {
        this.name = name;
        this.phone = phone;
        this.address = address;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Product {

    private String productID;
    private String name;
    private double length;
    private double width;
    private double height;
    private double volumeweight;
    private double grossweight;

    public Product(String productID, String name, double length, double width, double height, double grossweight,double volumeweight) {
        this.productID = productID;
        this.name = name;
        this.length = length;
        this.width = width;
        this.height = height;
        this.grossweight = grossweight;
        this.volumeweight = volumeweight;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public String getProductID() {
        return productID;
    }

    public void setProductID(String productID) {
        this.productID = productID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public double getVolumeweight() {
        return (length * width * height) / 6000;
    }

    public void setVolumeweight(double volumeweight) {
        this.volumeweight = volumeweight;
    }

    public double getGrossweight() {
        return grossweight;
    }

    public void setGrossweight(double grossweight) {
        this.grossweight = grossweight;
    }

    public double getChargeWeight() {
        return Math.max(grossweight, getVolumeweight());
    }
}

class Customer {

    private int customerID;
    private String name;
    private String phone;
    private String address;

    public Customer(int customerID, String name, String phone,String address) {
        this.customerID = customerID;
        this.name = name;
        this.phone = phone;
        this.address = address;
    }

    public int getCustomerID() {
        return customerID;
    }

    public void setCustomerID(int customerID) {
        this.customerID = customerID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

class Flight {

    private String flightNumber;
    private String departureAirport;
    private String arrivalAirport;
    private String date;
    private double maxLoad;

    public Flight(String flightNumber, String departureAirport, String arrivalAirport, String date, double maxLoad) {
        this.flightNumber = flightNumber;
        this.departureAirport = departureAirport;
        this.arrivalAirport = arrivalAirport;
        this.date = date;
        this.maxLoad = maxLoad;
    }

    public String getFlightNumber() {
        return flightNumber;
    }

    public void setFlightNumber(String flightNumber) {
        this.flightNumber = flightNumber;
    }

    public String getDepartureAirport() {
        return departureAirport;
    }

    public void setDepartureAirport(String departureAirport) {
        this.departureAirport = departureAirport;
    }

    public String getArrivalAirport() {
        return arrivalAirport;
    }

    public void setArrivalAirport(String arrivalAirport) {
        this.arrivalAirport = arrivalAirport;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public double getMaxLoad() {
        return maxLoad;
    }

    public void setMaxLoad(double maxLoad) {
        this.maxLoad = maxLoad;
    }
}

interface RateStrategy {
    double calculateRate(double chargeWeight);
}

class Rate implements RateStrategy {
    @Override
    public double calculateRate(double chargeWeight) {
        if (chargeWeight < 20) {
            return 35;
        } else if (chargeWeight >= 20 && chargeWeight < 50) {
            return 30;
        } else if(chargeWeight >= 50 && chargeWeight < 100){
            return 25;
        }else
            return 15;
    }
}

abstract class Payment {

    public abstract void pay(double amount);
}

class Alipay extends Payment {
    @Override
    public void pay(double amount) {
        System.out.println("支付宝支付金额: " + amount);
    }
}

class WechatPay extends Payment {
    @Override
    public void pay(double amount) {
        System.out.println("微信支付金额: " + amount);
    }
}

class Orderitem {

    private Product product;
    private double chargeWeight;
    private double rate;

    public Orderitem(Product product, RateStrategy rateStrategy) {
        this.product = product;
        this.chargeWeight = product.getChargeWeight();
        this.rate = rateStrategy.calculateRate(this.chargeWeight);
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public double getChargeWeight() {
        return chargeWeight;
    }

    public void setChargeWeight(double chargeWeight) {
        this.chargeWeight = chargeWeight;
    }

    public double getRate() {
        return rate;
    }

    public void setRate(double rate) {
        this.rate = rate;
    }
}

class Order {
    private String orderId;
    private String orderDate;
    private People sender;
    private People receiver;
    private Flight flight;
    private LinkedList<Orderitem> list = new LinkedList<>();
    private RateStrategy rateStrategy;

    public Order(String orderId, String orderDate, People sender, People receiver, Flight flight, LinkedList<Product> products, RateStrategy rateStrategy) {
        this.orderId = orderId;
        this.orderDate = orderDate;
        this.sender = sender;
        this.receiver = receiver;
        this.flight = flight;
        this.rateStrategy = rateStrategy;
    }

    public void setList(LinkedList<Orderitem> list) {
        this.list = list;
    }

    public Flight getFlight() {
        return flight;
    }

    public void setFlight(Flight flight) {
        this.flight = flight;
    }

    public People getReceiver() {
        return receiver;
    }

    public void setReceiver(People receiver) {
        this.receiver = receiver;
    }

    public People getSender() {
        return sender;
    }

    public void setSender(People sender) {
        this.sender = sender;
    }

    public String getOrderDate() {
        return orderDate;
    }

    public void setOrderDate(String orderDate) {
        this.orderDate = orderDate;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public void addItem(Orderitem item){
        this.list.add(item);
    }

    public double getTotalChargeWeight() {
        double total = 0;
        for (Orderitem item : list) {
            total += item.getChargeWeight();
        }
        return total;
    }

    public double getTotalFreightCost() {
        double totalCost = 0;
        for (Orderitem item : list) {
            double rate = rateStrategy.calculateRate(item.getChargeWeight());
            totalCost += item.getChargeWeight() * rate;
        }
        return totalCost;
    }
}

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int customerID = scanner.nextInt();
        scanner.nextLine();
        String customerName = scanner.nextLine();
        String customerPhone = scanner.nextLine();
        String customerAddress = scanner.nextLine();

        int productCount = scanner.nextInt();
        scanner.nextLine();
        LinkedList<Product> products = new LinkedList<>();
        for (int i = 0; i < productCount; i++) {
            String productID = scanner.nextLine();
            String productName = scanner.nextLine();
            double width = Double.parseDouble(scanner.nextLine());
            double length = Double.parseDouble(scanner.nextLine());
            double height = Double.parseDouble(scanner.nextLine());
            double grossWeight = Double.parseDouble(scanner.nextLine());
            double volumeWeight = (length * width * height) / 6000;
            products.add(new Product(productID, productName, length, width, height, grossWeight, volumeWeight));
        }

        String flightNumber = scanner.nextLine();
        String departure = scanner.nextLine();
        String arrival = scanner.nextLine();
        String flightDate = scanner.nextLine();
        double maxLoad = Double.parseDouble(scanner.nextLine());
        Flight flight = new Flight(flightNumber, departure, arrival, flightDate, maxLoad);

        String orderId = scanner.nextLine();
        String orderDate = scanner.nextLine();

        String senderAddress = scanner.nextLine();
        String senderName = scanner.nextLine();
        String senderPhone = scanner.nextLine();
        People sender = new People(senderName, senderPhone, senderAddress);

        String receiverAddress = scanner.nextLine();
        String receiverName = scanner.nextLine();
        String receiverPhone = scanner.nextLine();
        People receiver = new People(receiverName, receiverPhone, receiverAddress);

        RateStrategy rateStrategy = new Rate();
        Order order = new Order(orderId, orderDate, sender, receiver, flight, products, rateStrategy);

        LinkedList<Orderitem> orderItems = new LinkedList<>();
        for (Product product : products) {
            orderItems.add(new Orderitem(product, rateStrategy));
        }
        order.setList(orderItems);

        double totalWeight = order.getTotalChargeWeight();
        if (totalWeight > flight.getMaxLoad()) {
            System.out.printf("The flight with flight number:%s has exceeded its load capacity and cannot carry the order.\n",
                    flight.getFlightNumber());
            return;
        }

        System.out.printf("客户:%s(%s)订单信息如下:\n", customerName, customerPhone);
        System.out.println("-----------------------------------------");
        System.out.println("航班号:" + flight.getFlightNumber());
        System.out.println("订单号:" + orderId);
        System.out.println("订单日期:" + orderDate);
        System.out.println("发件人姓名:" + sender.getName());
        System.out.println("发件人电话:" + sender.getPhone());
        System.out.println("发件人地址:" + sender.getAddress());
        System.out.println("收件人姓名:" + receiver.getName());
        System.out.println("收件人电话:" + receiver.getPhone());
        System.out.println("收件人地址:" + receiver.getAddress());
        System.out.printf("订单总重量(kg):%.1f\n", totalWeight);
        System.out.printf("微信支付金额:%.1f\n\n", order.getTotalFreightCost());
        System.out.println("货物明细如下:");
        System.out.println("-----------------------------------------");
        System.out.println("明细编号\t货物名称\t计费重量\t计费费率\t应交运费");
        int index = 1;
        for (Orderitem item : orderItems) {
            System.out.printf("%d\t%s\t%.1f\t%.1f\t%.1f\n",
                    index++,
                    item.getProduct().getName(),
                    item.getChargeWeight(),
                    item.getRate(),
                    item.getChargeWeight() * item.getRate());
        }

        scanner.close();
    }
}

设计思路:

首先按照题目要求设计出People、Product、Flight、Customer、Order等类,根据题目要求处理不同货物费率计算;按顺序读取输入信息创建对应对象,计算每件货物的计费重量;校验订单总重量是否超过航班载重,超限则终止程序;未超限时根据货物类型和重量应用费率策略,结合客户折扣计算总运费,最终按指定格式输出订单详情、支付金额及货物明细。

类图展示:

源码分析:

使用SourceMonitor对源码分析,结果如下:

个人分析:
从上述结果可知代码中平均每个类含12.75个方法(如People、Product等),导致代码膨胀。Rate类费率硬编码,未支持动态配置或扩展其他策略。在下一次题集中会使用接口解决相关问题
心得体会:
一个类只做一件事,如Rate类只计算费率,Order类仅管理订单元数据,这是单一职责原则的体现

题集9第二次航空货运管理系统迭代:

点击查看题目
航空快递以速度快、安全性高成为急件或贵重物品的首选。本题目要求对航空货运管理系统进行类设计,具体说明参看说明文件。
OO第十二周作业题目说明.pdf

输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。

客户类型[可输入项:Individual/Corporate]
客户编号
客户姓名
客户电话
客户地址
货物类型[可输入项:Normal/Expedite/Dangerous]
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
支付方式[可输入项:Wechat/ALiPay/Cash]
输出格式:
如果订单中货物重量超过航班剩余载重量,程序输出The flight with flight number:航班号 has exceeded its load capacity and cannot carry the order. ,程序终止运行。
如果航班载重量可以承接该订单,输出如下:
客户:姓名(电话)订单信息如下:
-----------------------------------------
航班号:
订单号:
订单日期:
发件人姓名:
发件人电话:
发件人地址:
收件人姓名:
收件人电话:
收件人地址:
订单总重量(kg):
[微信/支付宝/现金]支付金额:

货物明细如下:
-----------------------------------------
明细编号    货物名称    计费重量    计费费率    应交运费
1    ...
2    ...
注:输出中实型数均保留1位小数。

输入样例:
在这里给出一组输入。例如:

Corporate
10001
郭靖
13807911234
南昌航空大学
Expedite
2
101
发电机
80
60
40
80
102
信号发生器
55
70
60
45
MU1234
昌北国际机场
大兴国际机场
2025-04-22
1000
900001
2025-04-22
南昌大学
洪七公
18907912325
北京大学
黄药师
13607912546
ALiPay
输出样例:
在这里给出相应的输出。例如:

客户:郭靖(13807911234)订单信息如下:
-----------------------------------------
航班号:MU1234
订单号:900001
订单日期:2025-04-22
发件人姓名:洪七公
发件人电话:18907912325
发件人地址:南昌大学
收件人姓名:黄药师
收件人电话:13607912546
收件人地址:北京大学
订单总重量(kg):125.0
支付宝支付金额:4360.0

货物明细如下:
-----------------------------------------
明细编号    货物名称    计费重量    计费费率    应交运费
1    发电机    80.0    40.0    3200.0
2    信号发生器    45.0    50.0    2250.0
代码长度限制
24 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
点击查看代码
import java.util.Objects;
import java.util.Scanner;
import java.util.LinkedList;

class People {
    private String name;
    private String phone;
    private String address;

    public People(String name, String phone, String address) {
        this.name = name;
        this.phone = phone;
        this.address = address;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Product {

    private String productID;
    private String name;
    private double length;
    private double width;
    private double height;
    private double volumeweight;
    private double grossweight;
    private final RateStrategy rateStrategy;

    public Product(String productID, String name, double length, double width, double height, double grossweight, double volumeweight, RateStrategy rateStrategy) {
        this.productID = productID;
        this.name = name;
        this.length = length;
        this.width = width;
        this.height = height;
        this.grossweight = grossweight;
        this.volumeweight = volumeweight;
        this.rateStrategy = rateStrategy;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public String getProductID() {
        return productID;
    }

    public void setProductID(String productID) {
        this.productID = productID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public double getVolumeweight() {
        return (length * width * height) / 6000;
    }

    public void setVolumeweight(double volumeweight) {
        this.volumeweight = volumeweight;
    }

    public double getGrossweight() {
        return grossweight;
    }

    public void setGrossweight(double grossweight) {
        this.grossweight = grossweight;
    }

    public double getChargeWeight() {
        return Math.max(grossweight, getVolumeweight());
    }

    public double getRate(double weight) {
        return rateStrategy.calculateRate(weight);
    }
}

abstract class Customer {

    private int customerID;
    private String name;
    private String phone;
    private String address;

    public Customer(int customerID, String name, String phone,String address) {
        this.customerID = customerID;
        this.name = name;
        this.phone = phone;
        this.address = address;
    }

    public int getCustomerID() {
        return customerID;
    }

    public void setCustomerID(int customerID) {
        this.customerID = customerID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public abstract double getDiscount();

}

class IndividualCustomer extends Customer {

    public IndividualCustomer(int customerID, String name, String phone, String address) {
        super(customerID, name, phone, address);
    }

    @Override
    public double getDiscount() {
        return 0.9;
    }
}

class CorporateCustomer extends Customer {

    public CorporateCustomer(int customerID, String name, String phone, String address) {
        super(customerID, name, phone, address);
    }

    @Override
    public double getDiscount() {
        return 0.8;
    }
}

class Flight {

    private String flightNumber;
    private String departureAirport;
    private String arrivalAirport;
    private String date;
    private double maxLoad;

    public Flight(String flightNumber, String departureAirport, String arrivalAirport, String date, double maxLoad) {
        this.flightNumber = flightNumber;
        this.departureAirport = departureAirport;
        this.arrivalAirport = arrivalAirport;
        this.date = date;
        this.maxLoad = maxLoad;
    }

    public String getFlightNumber() {
        return flightNumber;
    }

    public void setFlightNumber(String flightNumber) {
        this.flightNumber = flightNumber;
    }

    public String getDepartureAirport() {
        return departureAirport;
    }

    public void setDepartureAirport(String departureAirport) {
        this.departureAirport = departureAirport;
    }

    public String getArrivalAirport() {
        return arrivalAirport;
    }

    public void setArrivalAirport(String arrivalAirport) {
        this.arrivalAirport = arrivalAirport;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public double getMaxLoad() {
        return maxLoad;
    }

    public void setMaxLoad(double maxLoad) {
        this.maxLoad = maxLoad;
    }
}

interface RateStrategy {
    double calculateRate(double chargeWeight);
}

class NormalRate implements RateStrategy {
    @Override
    public double calculateRate(double chargeWeight) {
        if (chargeWeight < 20) {
            return 35;
        }
        else if (chargeWeight < 50) {
            return 30;
        }
        else if (chargeWeight < 100) {
            return 25;
        }
        else
            return 15;
    }
}

class DangerousRate implements RateStrategy {
    @Override
    public double calculateRate(double chargeWeight) {
        if (chargeWeight < 20) {
            return 80;
        }
        else if (chargeWeight < 50) {
            return 50;
        }
        else if (chargeWeight < 100) {
            return 30;
        }
        else
            return 20;
    }
}

class ExpeditedRate implements RateStrategy {
    @Override
    public double calculateRate(double chargeWeight) {
        if (chargeWeight < 20) return 60;
        else if (chargeWeight < 50) return 50;
        else if (chargeWeight < 100) return 40;
        else
            return 30;
    }
}

abstract class Payment {

    public abstract void pay(double amount);
}

class Alipay extends Payment {
    @Override
    public void pay(double amount) {
        System.out.printf("支付宝支付金额:%.1f\n\n",amount);
    }
}

class WechatPay extends Payment {
    @Override
    public void pay(double amount) {
        System.out.printf("微信支付金额:%.1f\n\n",amount);
    }
}

class CashPayment extends Payment {
    @Override
    public void pay(double amount) {
        System.out.printf("现金支付金额:%.1f\n\n",amount);
    }
}

class Orderitem {

    private Product product;
    private double chargeWeight;
    private double rate;

    public Orderitem(Product product, RateStrategy rateStrategy) {
        this.product = product;
        this.chargeWeight = product.getChargeWeight();
        this.rate = rateStrategy.calculateRate(this.chargeWeight);
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public double getChargeWeight() {
        return chargeWeight;
    }

    public void setChargeWeight(double chargeWeight) {
        this.chargeWeight = chargeWeight;
    }

    public double getRate() {
        return rate;
    }

    public void setRate(double rate) {
        this.rate = rate;
    }
}

class Order {
    private String orderId;
    private String orderDate;
    private People sender;
    private People receiver;
    private Flight flight;
    private LinkedList<Orderitem> list = new LinkedList<>();
    private RateStrategy rateStrategy;
    private Customer customer;

    public Order(String orderId, String orderDate, People sender, People receiver, Flight flight, LinkedList<Product> products, RateStrategy rateStrategy,Customer customer) {
        this.orderId = orderId;
        this.orderDate = orderDate;
        this.sender = sender;
        this.receiver = receiver;
        this.flight = flight;
        this.rateStrategy = rateStrategy;
        this.customer = customer;
    }

    public void setList(LinkedList<Orderitem> list) {
        this.list = list;
    }

    public Flight getFlight() {
        return flight;
    }

    public void setFlight(Flight flight) {
        this.flight = flight;
    }

    public People getReceiver() {
        return receiver;
    }

    public void setReceiver(People receiver) {
        this.receiver = receiver;
    }

    public People getSender() {
        return sender;
    }

    public void setSender(People sender) {
        this.sender = sender;
    }

    public String getOrderDate() {
        return orderDate;
    }

    public void setOrderDate(String orderDate) {
        this.orderDate = orderDate;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public void addItem(Orderitem item){
        this.list.add(item);
    }

    public double getTotalChargeWeight() {
        double total = 0;
        for (Orderitem item : list) {
            total += item.getChargeWeight();
        }
        return total;
    }

    public double getTotalFreightCost() {
        double totalCost = 0;
        for (Orderitem item : list) {
            double rate = rateStrategy.calculateRate(item.getChargeWeight());
            totalCost += item.getChargeWeight() * rate;
        }
        return totalCost * customer.getDiscount();
    }
}

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String customerType = scanner.nextLine();
        Customer customer = null;
        int customerID = scanner.nextInt();
        scanner.nextLine();

        String customerName = scanner.nextLine();
        String customerPhone = scanner.nextLine();
        String customerAddress = scanner.nextLine();
        if(Objects.equals(customerType, "Individual")){
            customer = new IndividualCustomer(customerID,customerName,customerPhone,customerAddress);
        }else if(Objects.equals(customerType,"Corporate")){
            customer = new CorporateCustomer(customerID,customerName,customerPhone,customerAddress);
        }else{
            System.out.println("Wrong Format");
        }

        String cargoType = scanner.nextLine();
        RateStrategy rateStrategy = null;
        if(Objects.equals(cargoType, "Normal")){
            rateStrategy = new NormalRate();
        }else if(Objects.equals(cargoType,"Expedite")){
            rateStrategy = new ExpeditedRate();
        }else if(Objects.equals(cargoType,"Dangerous")){
            rateStrategy = new DangerousRate();
        }else{
            System.out.println("Wrong Format");
        }

        int productCount = scanner.nextInt();
        scanner.nextLine();
        LinkedList<Product> products = new LinkedList<>();
        for (int i = 0; i < productCount; i++) {
            String productID = scanner.nextLine();
            String productName = scanner.nextLine();
            double width = Double.parseDouble(scanner.nextLine());
            double length = Double.parseDouble(scanner.nextLine());
            double height = Double.parseDouble(scanner.nextLine());
            double grossWeight = Double.parseDouble(scanner.nextLine());
            double volumeWeight = (length * width * height) / 6000;
            products.add(new Product(productID, productName, length, width, height, grossWeight, volumeWeight,rateStrategy));
        }

        String flightNumber = scanner.nextLine();
        String departure = scanner.nextLine();
        String arrival = scanner.nextLine();
        String flightDate = scanner.nextLine();
        double maxLoad = Double.parseDouble(scanner.nextLine());
        Flight flight = new Flight(flightNumber, departure, arrival, flightDate, maxLoad);

        String orderId = scanner.nextLine();
        String orderDate = scanner.nextLine();

        String senderAddress = scanner.nextLine();
        String senderName = scanner.nextLine();
        String senderPhone = scanner.nextLine();
        People sender = new People(senderName, senderPhone, senderAddress);

        String receiverAddress = scanner.nextLine();
        String receiverName = scanner.nextLine();
        String receiverPhone = scanner.nextLine();
        String paymentType = scanner.nextLine();
        Payment payment = null;
        if(Objects.equals(paymentType, "Wechat")){
            payment = new WechatPay();
        }else if(Objects.equals(paymentType,"ALiPay")){
            payment = new Alipay();
        }else if(Objects.equals(paymentType,"Cash")){
            payment = new CashPayment();
        }else{
            System.out.println("Wrong Format");
        }


        People receiver = new People(receiverName, receiverPhone, receiverAddress);

        Order order = new Order(orderId, orderDate, sender, receiver, flight, products, rateStrategy,customer);

        LinkedList<Orderitem> orderItems = new LinkedList<>();
        for (Product product : products) {
            orderItems.add(new Orderitem(product, rateStrategy));
        }
        order.setList(orderItems);

        double totalWeight = order.getTotalChargeWeight();
        if (totalWeight > flight.getMaxLoad()) {
            System.out.printf("The flight with flight number:%s has exceeded its load capacity and cannot carry the order.\n",
                    flight.getFlightNumber());
            return;
        }

        System.out.printf("客户:%s(%s)订单信息如下:\n", customerName, customerPhone);
        System.out.println("-----------------------------------------");
        System.out.println("航班号:" + flight.getFlightNumber());
        System.out.println("订单号:" + orderId);
        System.out.println("订单日期:" + orderDate);
        System.out.println("发件人姓名:" + sender.getName());
        System.out.println("发件人电话:" + sender.getPhone());
        System.out.println("发件人地址:" + sender.getAddress());
        System.out.println("收件人姓名:" + receiver.getName());
        System.out.println("收件人电话:" + receiver.getPhone());
        System.out.println("收件人地址:" + receiver.getAddress());
        System.out.printf("订单总重量(kg):%.1f\n", totalWeight);
        payment.pay(order.getTotalFreightCost());
        System.out.println("货物明细如下:");
        System.out.println("-----------------------------------------");
        System.out.println("明细编号\t货物名称\t计费重量\t计费费率\t应交运费");
        int index = 1;
        for (Orderitem item : orderItems) {
            System.out.printf("%d\t%s\t%.1f\t%.1f\t%.1f\n",
                    index++,
                    item.getProduct().getName(),
                    item.getChargeWeight(),
                    item.getRate(),
                    item.getChargeWeight() * item.getRate());
        }

        scanner.close();
    }
}
---

设计思路:

本次题目在原有运费计算基础上新增了三种货物的费率计算体系和三类用户的折扣机制。根据图示费率标准,本次迭代需采用策略模式实现不同货物类型的独立计费策略(NormalRate、DangerousRate、ExpeditedRate),每个策略类封装特定分段函数计算逻辑来符合开闭原则。用户折扣机制可以通过抽象客户类型(Individual、Corporate)并定义getDiscount()方法实现多态。设计将计费重量、货物费率、用户折扣进行职责分离:Product类负责体积/实际重量比较,OrderItem类组合货物对象与费率策略,Order类聚合订单项并调用客户折扣,最终设计OrderProcessor类协调计算流程,体现单一职责和合成复用原则。

源码分析:

使用SourceMonitor对源码分析,结果如下:

个人分析:
在开始时遗漏了折扣的计算,导致费率计算错误,通过多态机制的有效运用,能够在客户类型、费率策略、支付方式等维度实现了良好的扩展性,但还是使用了许多if-else语句,使代码复杂。
心得体会:
在本次迭代中,由于不同类的划分,在类与类的关系和调用不同类的方法时,会出现错误,因此我认为,最好一开始就把类设计好,而不要盲目埋头写代码,这样对于后面的扩展和复用会方便很多,在本次题集中一直没能理清类和类之间的关系,导致后面改了又改,十分麻烦,应该一开始就理清类和类之间的关系。

三、总结:

1、问题:

在本轮题集中,发现Main类中存在多层嵌套的条件分支(如客户类型、支付方式判断),违反开放封闭原则,新增策略需修改核心流程并且RateStrategy策略实例化仍依赖if-else硬编码,导致策略扩展需修改客户端代码,了解后面会学习工厂模式来解决相关问题。

2、收获:

在本轮题集中,我能够逐渐理解继承和多态方面的运用,理清了子类和父类之间是如何继承,并能通过接口来实现多态,体会到了可复用和拓展带来的方便。

3、反思:

经过本轮题集,在今后的学习中,要先设计好类和类与类之间的关系,在代码的编写中尽量满足面向对象七大核心设计原则,后续学习中加强对工厂等模式的学习。

posted @ 2025-05-25 14:41  qe终暮  阅读(27)  评论(0)    收藏  举报