试题一(15分)
阅读以下说明,回答问题1至问题3。
【说明】
某在线教育平台拟开发一套课程订单管理系统,支持课程下单、支付、订单状态流转、订单通知等功能。系统采用面向对象方法进行设计,在设计建模阶段提出如下需求:
(1)订单优惠计算:系统需根据订单金额、会员等级、促销活动等条件,提供满减、折扣、优惠券等多种优惠方式,优惠策略经常调整,新增优惠策略时不得修改订单处理核心代码;
(2)支付渠道对接:系统需支持微信支付、支付宝、银联等多种支付渠道,各渠道提供的支付接口(SDK)调用方式各不相同,更换或新增支付渠道时应尽量减少对系统其他部分的修改;
(3)订单状态流转:订单具有"待支付、已支付、待发货、已发货、已完成、已取消"等状态,不同状态下对订单执行支付、发货、取消等操作的行为不同,且状态转换规则复杂、后期可能增加新状态;
项目组已掌握以下设计模式:Builder(构建器)、Singleton(单例)、Prototype(原型)、Adapter(适配器)、Facade(外观)、Strategy(策略)、Observer(观察者)、State(状态)、Command(命令)。
【问题3】(5分)下面图3给出了采用状态模式对订单状态流转进行设计的类图(部分)。请从下面给出的(a)~(j)中选择合适的选项,填入图3中(1)~(9)处(每空1分):
(a)Order (b)State (c)待支付状态类 (d)已支付状态类 (e)已发货状态类
(f)聚合 (g)继承(泛化) (h)实现 (i)handle() (j)request()
参考答案状态模式类图结构:
(1)Order(上下文类,持有当前状态)
(2)State(抽象状态类,定义接口)
(3)待支付状态类(具体状态类)
(4)已支付状态类(具体状态类)
(5)已发货状态类(具体状态类)
(6)继承(泛化):具体状态类继承抽象State类
(7)聚合:Order聚合State对象
(8)handle():State类中声明的抽象方法
(9)request():Order类中委托给状态处理的方法
【解析】状态模式结构:上下文(Order)持有抽象状态(State)引用,多个具体状态类继承State并实现handle()方法,Order的request()方法委托给当前状态对象的handle()处理。