软件构造lab3报告

本文只提供部分代码及思路

1实验目标概述

本次实验覆盖课程第 3、4、5 章的内容,目标是编写具有可复用性和可维护
性的软件,主要使用以下软件构造技术:
⚫ 子类型、泛型、多态、重写、重载
⚫ 继承、代理、组合
⚫ 常见的 OO 设计模式
⚫ 语法驱动的编程、正则表达式
⚫ 基于状态的编程
⚫ API 设计、API 复用
本次实验给定了五个具体应用(高铁车次管理、航班管理、操作系统进程管
理、大学课表管理、学习活动日程管理),学生不是直接针对五个应用分别编程
实现,而是通过 ADT 和泛型等抽象技术,开发一套可复用的 ADT 及其实现,充
分考虑这些应用之间的相似性和差异性,使 ADT 有更大程度的复用(可复用性)
和更容易面向各种变化(可维护性)。

2 实验环境配置

3 实验过程

3.1 待开发的三个应用场景

列出你所选定的三个应用。
1.航班管理
2.高铁车次管理
3.学习日程管理

分析三个应用场景的异同,理解需求:它们在哪些方面有共性、哪些方面有差异。
位置分为2个、多个、1个;航班与学习日程不能阻塞/挂起

3.2 面向可复用性和可维护性的设计:PlanningEntry

3.2.1 PlanningEntry的共性操作

PlanningEntry设计成一个接口,存放有三个不同类型计划项的工厂方法并设计了一些三个计划项共有的方法
在这里插入图片描述

3.2.2 局部共性特征的设计方案

在CommonPlanningEntry实现PlanningEntry通用的方法,如设置状态state及返回一些计划项的属性值等等。。
在这里插入图片描述
在这里插入图片描述

3.2.3 面向各应用的PlanningEntry子类型设计(个性化特征的设计方案)

三个子类型主要是资源Resource的不同以及位置的不同,例如为航班计划项分配资源时传入的参数是Plane类型
在这里插入图片描述

3.3 面向复用的设计:R

Resource设计为三个工厂方法的接口,返回三种不同的资源类
以Plane为例,设置了四个私有变量,飞机编号、机型号、座位数、机龄,并设有四个变量的getter函数
在这里插入图片描述
并且重写了判断飞机资源是否相等的equals方法
在这里插入图片描述

3.4 面向复用的设计:Location

由于三个计划项的位置数量信息不同,在Location中以list保存单个的计划项的不同位置且设有getter函数,并以list保存所有计划项的位置信息,
在这里插入图片描述
在这里插入图片描述
例如某个航班计划项的位置信息,起飞地点保存在locations.get(0),降落地点保存在get(1);
学习活动只有一个位置则保存在get(0)

3.5 面向复用的设计:Timeslot

设有两个容器,用来分别保存开始时间和结束时间,使用方法与Location类似
在这里插入图片描述

3.6 面向复用的设计:EntryState及State设计模式

在EntryStateEnum中保存了六种不同状态的枚举
在这里插入图片描述
并在State中进行状态的转换以及返回状态值

3.7 面向应用的设计:Board

以航班为例,展示板是查询输入的当前时间特定位置所有的计划项信息,各种Board类传入的参量是以该计划项的list集合,并设有可视化方法,传入的参量是当前时间与特定位置
在这里插入图片描述
在这里插入图片描述

3.8 Board的可视化:外部API的复用

首先遍历所有计划项,如果寻找到与特定位置相同的计划项则进行下一步判断
在这里插入图片描述
将传入的当前时间与寻找到的计划项的开始与结束时间LocalDateTime化,如果当前时间在计划项时间之中的话,就将信息添加到flightboard容器中
在这里插入图片描述
之后将容器中信息分组以String[][]保存并传入Table中进行展示
在这里插入图片描述

3.10 可复用API设计及Façade设计模式

3.10.1 检测一组计划项之间是否存在位置独占冲突

构建了map类,键值为位置,值为计划项
遍历计划项,判断map中是否有计划项信息,没有则添加,有则进行判断,返回错误

3.10.2 检测一组计划项之间是否存在资源独占冲突

与检察位置冲突类似,键值为资源(Plant或Train),值为计划项

3.10.3 提取面向特定资源的前序计划项

将传入计划项的结束时间Local DateTime化,遍历计划项,若时间在其之前且资源相同则返回

3.11 设计模式应用

请分小节介绍每种设计模式在你的ADT和应用设计中的具体应用。

3.11.1 Factory Method

资源类设置三个工厂方法
在这里插入图片描述

3.11.2 Iterator

迭代比较
在这里插入图片描述

3.11.3 Strategy

在CheckResourceExclusiveConflict中使用两个方法实现
在这里插入图片描述
在这里插入图片描述

3.12 应用设计与开发

利用上述设计和实现的ADT,实现手册里要求的各项功能。
只需保留你选定的三个应用即可。

3.12.1 航班应用

设有各种需要使用的全局静态私有变量及其集合
首先读入文本信息再打印菜单
在这里插入图片描述
通过1,3,5选项进行构建新信息,再通过7为计划项分配资源
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.12.2 高铁应用

与航班类似

3.12.5 学习活动应用

与航班类似

3.13 基于语法的数据读入

文件每13行构成一个完整的计划项及资源信息,所以每13行进行循环数据处理
在这里插入图片描述
设计正则表达式

Flight:(.*?),(.*?)\n\\{\nDepartureAirport:(.*?)\nArrivalAirport:(.*?)\nDepatureTime:(.*?)\nArrivalTime:(.*?)\nPlane:(.*?)\n\\{\nType:(.*?)\nSeats:(.*?)\nAge:(.*?)\n\\}\n\\}\n

将传入的字符串分组提取
在这里插入图片描述
之后进行各种判断是否合法

3.14 应对面临的新变化

3.14.1 变化1

由于我所设置的Location是集合变量,支持经停,在get的时候以下标表示即可(如get(0)get(1)get(2))

3.14.2 变化2

重写火车计划项的cancel方法
在这里插入图片描述

3.14.3 变化3

在活动计划项中添加block即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值