第二次博客作业

航空货运管理系统分析

1.题目:

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

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 ...

2.分析:

  1. 类结构
    • Customer:表示客户信息
    • Cargo:表示货物信息,包含计费重量和运费计算逻辑
    • Flight:表示航班信息,管理载重容量
    • Order:表示订单信息,关联客户、货物和航班
    • AirCargoManagementSystem:主类,处理输入输出和业务逻辑
  2. 核心业务逻辑
    • 计费重量计算:取实际重量和体积重量(长×宽×高/6000)中的较大值
    • 运费计算:根据计费重量分段计价(≤20kg:30元/kg, ≤50kg:25元/kg, >50kg:20元/kg)
    • 航班载重检查:确保订单总重量不超过航班剩余载重能力

一、单一职责原则(SRP)分析

原则要求:一个类应该只有一个引起它变化的原因

代码体现

  1. Customer类:仅处理客户信息存储和访问

java复制

class Customer {

private String id, name, phone, address;

// 只有getter方法

}

  1. Cargo类:专注于货物信息和运费计算

java复制

class Cargo {

// 货物属性

public double getChargeableWeight() { /* 计费重量计算 */ }

public double getRate() { /* 费率计算 */ }

}

  1. Flight类:管理航班信息和载重控制

java复制

class Flight {

public boolean canCarryOrder(Order order) { /* 载重检查 */ }

public void addOrder(Order order) { /* 添加订单 */ }

}

优点

  • 每个类职责明确单一
  • 业务逻辑分散到不同类中
  • 修改一个功能不会影响其他类

改进建议

  • 运费计算逻辑可以进一步分离到专门的策略类

二、开闭原则(OCP)分析

原则要求:对扩展开放,对修改关闭

当前实现

java复制

class Cargo {

public double getRate() {

if (chargeableWeight <= 20) return 30.0;

else if (chargeableWeight <= 50) return 25.0;

else return 20.0;

}

}

问题

  • 费率计算硬编码在类中
  • 修改费率规则需要修改Cargo类

改进方案

  1. 使用策略模式

java复制

interface RateStrategy {

double calculateRate(double weight);

}

class StandardRateStrategy implements RateStrategy {

public double calculateRate(double weight) {

// 实现标准费率

}

}

class Cargo {

private RateStrategy rateStrategy;

public void setRateStrategy(RateStrategy strategy) {

this.rateStrategy = strategy;

}

public double getRate() {

return rateStrategy.calculateRate(this.getChargeableWeight());

}

}

优点

  • 可以灵活更换费率策略
  • 新增费率策略不影响现有代码
  • 符合开闭原则

三、里氏替换原则(LSP)分析

原则要求:子类应该可以替换父类而不影响程序正确性

当前实现

  • 当前设计没有明显的继承层次
  • 所有类都是具体实现,没有抽象基类

改进方案

  1. 引入抽象基类

java复制

abstract class User {

protected String name;

protected String phone;

// 公共方法

}

class Customer extends User {

// 特有属性

}

class Sender extends User {

// 发件人特有属性

}

  1. 多态应用

java复制

abstract class Cargo {

public abstract double getShippingFee();

}

class StandardCargo extends Cargo {

// 实现标准运费计算

}

class DangerousCargo extends Cargo {

// 实现危险品特殊运费

}

优点

  • 建立清晰的继承层次
  • 子类可以替换父类使用
  • 便于扩展新的货物类型

四、接口隔离原则(ISP)分析

原则要求:客户端不应该被迫依赖它不使用的接口

当前问题

  • 当前设计中没有显式定义接口
  • 类之间直接依赖具体实现

改进方案

  1. 定义细粒度接口

java复制

interface ICargoInfo {

String getId();

String getName();

double getWeight();

}

interface IShippingCalculator {

double calculateShippingFee();

}

class Cargo implements ICargoInfo, IShippingCalculator {

// 实现两个接口

}

  1. 按需依赖

java复制

class Order {

public void printCargoInfo(ICargoInfo cargo) {

// 只使用货物信息相关方法

}

public void calculateFee(IShippingCalculator calculator) {

// 只使用运费计算相关方法

}

}

优点

  • 客户端只依赖需要的接口
  • 减少不必要的耦合
  • 接口变更影响范围小
posted @ 2025-05-25 21:54  Godknowsit  阅读(23)  评论(0)    收藏  举报