第二次博客作业
航空货运管理系统分析
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.分析:
- 类结构:
- Customer:表示客户信息
- Cargo:表示货物信息,包含计费重量和运费计算逻辑
- Flight:表示航班信息,管理载重容量
- Order:表示订单信息,关联客户、货物和航班
- AirCargoManagementSystem:主类,处理输入输出和业务逻辑
- 核心业务逻辑:
- 计费重量计算:取实际重量和体积重量(长×宽×高/6000)中的较大值
- 运费计算:根据计费重量分段计价(≤20kg:30元/kg, ≤50kg:25元/kg, >50kg:20元/kg)
- 航班载重检查:确保订单总重量不超过航班剩余载重能力
一、单一职责原则(SRP)分析
原则要求:一个类应该只有一个引起它变化的原因
代码体现:
- Customer类:仅处理客户信息存储和访问
java复制
class Customer {
private String id, name, phone, address;
// 只有getter方法
}
- Cargo类:专注于货物信息和运费计算
java复制
class Cargo {
// 货物属性
public double getChargeableWeight() { /* 计费重量计算 */ }
public double getRate() { /* 费率计算 */ }
}
- 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类
改进方案:
- 使用策略模式:
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)分析
原则要求:子类应该可以替换父类而不影响程序正确性
当前实现:
- 当前设计没有明显的继承层次
- 所有类都是具体实现,没有抽象基类
改进方案:
- 引入抽象基类:
java复制
abstract class User {
protected String name;
protected String phone;
// 公共方法
}
class Customer extends User {
// 特有属性
}
class Sender extends User {
// 发件人特有属性
}
- 多态应用:
java复制
abstract class Cargo {
public abstract double getShippingFee();
}
class StandardCargo extends Cargo {
// 实现标准运费计算
}
class DangerousCargo extends Cargo {
// 实现危险品特殊运费
}
优点:
- 建立清晰的继承层次
- 子类可以替换父类使用
- 便于扩展新的货物类型
四、接口隔离原则(ISP)分析
原则要求:客户端不应该被迫依赖它不使用的接口
当前问题:
- 当前设计中没有显式定义接口
- 类之间直接依赖具体实现
改进方案:
- 定义细粒度接口:
java复制
interface ICargoInfo {
String getId();
String getName();
double getWeight();
}
interface IShippingCalculator {
double calculateShippingFee();
}
class Cargo implements ICargoInfo, IShippingCalculator {
// 实现两个接口
}
- 按需依赖:
java复制
class Order {
public void printCargoInfo(ICargoInfo cargo) {
// 只使用货物信息相关方法
}
public void calculateFee(IShippingCalculator calculator) {
// 只使用运费计算相关方法
}
}
优点:
- 客户端只依赖需要的接口
- 减少不必要的耦合
- 接口变更影响范围小

浙公网安备 33010602011771号