前言
本次题目集较之前的题目集难度有所下降,重点由算法转到类的设计,聚焦于单一职责原则、里氏代换原则、开闭原则以及合成复用原则、依赖倒转原则这五个设计原则.通过航空货运管理系统这道题目锻炼提高对面向对象设计原则的掌握.
一.题目
航空货运管理系统
本次题目模拟某客户到该航空公司办理一次货运业务的过程:
航空公司提供如下信息:
航班信息(航班号,航班起飞机场,航班降落机场,航班日期,航班最大载
重量)
客户填写货运订单并进行支付,需要提供如下信息:
客户信息(姓名,电话号码等)
货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等)
运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选
航班号,订单日期)
支付方式(支付宝支付、微信支付、现金支付)
注:一个货运订单可以运送多件货物,每件货物均需要根据重量及费率单独
计费。
程序需要从键盘依次输入填写订单需要提供的信息,然后分别生成订单信
息报表及货物明细报表。
题目要求
本次题目重点考核面向对象设计原则中的单一职责原则、里氏代换原则、开
闭原则以及合成复用原则、依赖倒转原则,除需要在PTA平台提交源码外,还
需要在超星平台提交本次作业最终得分源码(首次提交最高分源码)的类图,
评判标准为:
基础得分:PTA实际得分
设计因素:单一职责原则(20%)、里氏代换原则(20%)、开闭原则(20%)、
合成复用原则(20%)、依赖倒转原则(20%)。
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户类型
客户编号
客户姓名
客户电话
客户地址
货物类型
运送货物数量
货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
支付方式
输出格式:
如果订单中货物重量超过航班剩余载重量,程序输出The flight with flight number:航班号 has exceeded its load capacity and cannot carry the order. ,程序终止运行。
如果航班载重量可以承接该订单,输出如下:
客户:姓名(电话)订单信息如下:
航班号:
订单号:
订单日期:
发件人姓名:
发件人电话:
发件人地址:
收件人姓名:
收件人电话:
收件人地址:
订单总重量(kg):
微信/支付宝/现金支付金额:
货物明细如下:
明细编号 货物名称 计费重量 计费费率 应交运费
1 ...
2 ...
二.设计与分析
首先是航班类

根据单一职责原则航班类只需要有编号,出发地,目的地,载重,日期等属性及其get,set方法和自身构造方法即可.单一职责原则通过将复杂功能拆解为独立的单元,使系统结构更清晰、更灵活.
接着是顾客类和货物类


这两个类都有不同的类型,顾客类型分为Individual/Corporate两种,不同类型的顾客支付的费用不同,货物类型分Normal/Expedite/Dangerous三种,不同类型的货物所要支付的运费也不同.根据里氏代换原则:所有引用父类(基类)的地方必须能透明地使用其子类的对象,即子类对象可以完全替代父类对象,且程序的行为不会发生任何异常或不可预期的变化。对于顾客,设计了Customer类作为父类,Indivicustomer和Corcustomer作为子类,代表两种不同类型的顾客,子类实现了父类的所有方法所有,所有引用Customer类的地方都可以使用Indivicustomer和Corcustomer.
根据开闭原则件实体(类、模块、函数等)应当对扩展开放,对修改关闭.
之后如果有其它类型的顾客或货物也可以进行扩展,不需要改变原有代码,具有良好的扩展性。符合开闭原则。
然后是订单类

这里把顾客类和货物类分别作为一个属性ArrayList<Good goods和Customer customer进行合成复用.符合合成复用原则(Composite Reuse Principle, CRP),又称组合 / 聚合复用(Composition/Aggregation Reuse Principle),是面向对象设计的重要原则之一。其核心思想是:优先使用组合(Composition)或聚合(Aggregation)而非继承来实现代码复用,通过将已有对象组合到新对象中,使之成为新对象的一部分,从而复用其功能。通过组合将Good和Customer融入到Order类中提高代码可读性和可维护性,降低耦合度,保持类的单一职责每个类专注于自身核心职责,被复用的功能由独立类实现.
踩坑心得
本次题目集还是有许多不足之处.
在设计方面,如计算货物运费按照单一职责原则应该放在一个单独的类中实现.在设计时疏忽了这一点,将计算货物运费放在了订单类中,如果之后计算货物运费公式需要变化,要对整个订单类进行更改.
改进建议
将计算货物运费按照单一职责原则应该放在一个单独的类中实现.
抽象方法更多的使用接口声明以符合依赖倒转原则:高层模块不应该依赖低层模块,二者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。
总结
设计原则是面向对象编程的重要部分,具有显著价值:
提升代码质量:通过单一职责、开闭原则等,拆分复杂模块,减少代码冗余,使结构更清晰易读,降低维护成本。
降低变更风险:遵循里氏代换、依赖倒置原则,通过抽象接口隔离变化,扩展新功能时无需修改原有稳定代码,避免 “牵一发而动全身” 的风险。
增强可复用性:合成复用原则鼓励组合现有模块而非继承,提升组件复用性,加速开发效率。
适应需求迭代:设计原则帮助程序灵活应对变化,延长程序生命周期,减少因需求变更导致的成本,使程序更具生命力。
本轮题目集提高了编程能力,抽象思维,设计能力.
浙公网安备 33010602011771号