3.3 面向复用的设计:CircularOrbit<L,E>· 1
3.10.4 PersonalAppEcosystem· 2
3.11.4 PersonalAppEcosystem· 3
本次实验覆盖课程第 3、5、6 章的内容,目标是编写具有可复用性和可维护 性的软件,主要使用以下软件构造技术:
子类型、泛型、多态、重写、重载
继承、代理、组合
常见的 OO 设计模式
语法驱动的编程、正则表达式
基于状态的编程
API 设计、API 复用
本次实验给定了五个具体应用(径赛方案编排、太阳系行星模拟、原子结构 可视化、个人移动 App 生态系统、个人社交系统),学生不是直接针对五个应用 分别编程实现,而是通过 ADT 和泛型等抽象技术,开发一套可复用的 ADT 及其 实现,充分考虑这些应用之间的相似性和差异性,使 ADT 有更大程度的复用(可 复用性)和更容易面向各种变化(可维护性)。
Windos10专业版,eclipse,IDEA,jdk-9.01,Junit5.
在这里给出你的GitHub Lab3仓库的URL地址(Lab3-学号)。
git@github.com:ComputerScienceHIT/Lab3-1170300821.git
首先请列出你要完成的具体应用场景(至少3个,1和2中选一,3必选,4和5中选一,鼓励完成更多的应用场景)。
- TrackGame
- AtomStructure
- SocialNetworkCircle
分析你所选定的多个应用场景的异同,理解需求:它们在哪些方面有共性、哪些方面有差异。
-
- 基于语法的图数据输入
- 面向复用的设计:CircularOrbit<L,E>
L | 中心物体 |
E | 轨道上的物体 |
方法 | 用途 |
public void addCentralObject(L object); | 添加中心物体(考虑后续功能扩展,放入set中) |
public void addTrack(Track t); | 添加轨道到set中 |
public void removeTrack(Track t); | 从set中去除轨道 |
public void addObjectToTrack(E object, Track t); | 添加轨道到物体的映射关系 |
public void addRealationship(E object1, E object2); | 添加物体到物体的映射关系 |
public void readFiles(String filename); | 从文件中读取系统基本信息 |
ConcreteCircularOrbit<L, E> implements CircularOrbit<L, E> :
L | 中心物体 |
E | 轨道上的物体 |
public Set<Track> trackSet = new HashSet<>(); | 轨道的集合 |
public Set<E> objectSet = new HashSet<>(); | 轨道上物体的集合 |
public Set<L> centralObjectSet = new HashSet<>(); | 中心物体的集合 |
public Map<Track, Set<E>> relationMap = new HashMap<>(); | 轨道和物体的对应关系 |
public Map<E, E> objectRelation = new HashMap<>(); | 轨道上物体间的关系 |
方法 | 用途 |
public void addCentralObject(L object); | 添加中心物体(考虑后续功能扩展,放入set中) |
public void addTrack(Track t); | 添加轨道到set中 |
public void removeTrack(Track t); | 从set中去除轨道 |
public void addObjectToTrack(E object, Track t); | 添加轨道到物体的映射关系 |
public void addRealationship(E object1, E object2); | 添加物体到物体的映射关系 |
public void readFiles(String filename); | 从文件中读取系统基本信息 |
-
- 面向复用的设计:Track
Track抽象类:
protected int trackRadius; | Track的轨道半径 |
方法 | 作用 |
Getter | Getter |
public boolean equal(Track track) | 半径相等时认定两个track相等 |
TrackGame的GameTrack:
protected int trackRadius; | Super |
private int Group; | 标记轨道所在的分组 (用于后续改进) |
方法 | 作用 |
Getter | Getter |
AtomStructure的AtomStructureTrack:
private int trackNumber; | 电子轨道层数 |
private String atomName; | 电子对应原子名 |
方法 | 作用 |
Getter | Getter |
SocialNetworkCircle的SocialNetworkCircleTrack:
protected int trackRadius; | Super |
L复用作为中心物体
Orbit类 | 中心物体类 |
ConcreteCircularOrbit<L, E> | CentralObject |
TrackGame | 无 |
AtomStructure | AtomCentralObject |
SocialNetworkCircle | SocialNetworkCentralObject |
CentralObject:
中心物体名 | |
Getter | Getter |
AtomCentralObject:
protected String name | 原子名(扩展后可作为质子、中子) |
SocialNetworkCentralObject:
private int age; | 中心用户的年龄 |
private String gender; | 性别 |
Getter | Getter |
-
- 面向复用的设计:PhysicalObject
Orbi类 | 轨道物体类 |
ConcreteCircularOrbit<L, E> | PhysicalObject |
TrackGame | Athlete |
AtomStructure | Electron |
SocialNetworkCircle | Friend |
PhysicalObject:
protected String objectName = new String(); | 轨道物体名 |
protected Position position = null; | 轨道物体的位置 |
Getter | Getter |
hashCode | hashCode |
Athlete
private int number; | 号码 |
private String country = new String(); | 国籍 |
private int age; | 年龄 |
private double bestgrade; | 本年度最好成绩 |
Getter | Getter |
hashCode | hashCode |
equals | 判断 |
Electron
private String atomName | 对应原子名 |
Getter | Getter |
hashCode | hashCode |
Friend
private int age; | 姓名 |
private String gender; | 年龄 |
Getter | Getter |
-
- 可复用API设计
CircularOrbitAPIs<L, E>:
L | 中心物体 |
E | 轨道上的物体 |
public double getObjectDistributionEntropy(CircularOrbit c) | 计算多轨道系统中各轨道上物体分布的熵值 |
public int getLogicalDistance(CircularOrbit c, E e1, E e2) | 计算任意两个物体之间的最短逻辑距离 |
public double getPhysicalDistance(CircularOrbit c, E e1, E e2) | 计算任意两个物体之间的物理距离 |
public Difference getDifference(CircularOrbit c1, CircularOrbit c2) | 计算两个多轨道系统之间的差异 |
TrackGameAPI extends CircularOrbitAPIs :
public int getLogicalDistance(CircularOrbit c, E e1, E e2) | 计算任意两个物体之间的最短逻辑距离 |
public Difference getDifference(CircularOrbit c1, CircularOrbit c2) | 计算两个多轨道系统之间的差异 |
public void randomSort(TrackGameOrbit trackC) | 随机安排运动员分组 |
public void S2B_Sort(TrackGameOrbit trackC) | 根据成绩分组 |
public boolean moveInGroup(TrackGameOrbit C1, Athlete a1, Athlete a2) | 在组内调整赛道安排 |
public boolean moveBetweenGroup(TrackGameOrbit C1, Athlete a1, Athlete a2) | 不同分组间调整赛道安排 |
private Set<String> writeDifference(Map<GameTrack, Set<Athlete>> mapC, GameTrack track) | 写difference |
public double getObjectDistributionEntropy(CircularOrbit c) | 计算多轨道系统中各轨道上物体分布的熵值 |
public void removeElectronic(AtomStructureOrbit C,int i) | 去除某个轨道上的电子 |
public Difference getDifference(CircularOrbit c1, CircularOrbit c2) | 计算两个多轨道系统之间的差异 |
public void electronictransition(AtomStructureOrbit C1, int t1, int t2) | 一个电子跃迁t1→t2 |
AtomStructureAPI extends CircularOrbitAPIs
CircularOrbit<L,E>
CentralObject
PhysicalObject
Track
Difference
APIs
请分小节介绍每种设计模式在你的ADT和应用设计中的具体应用。
- 初始化和清空
- 计算距离
- 计算差异
- 调整分组
- 增删运动员
- 初始化和清空
- 计算距离
- 计算差异
- 调整分组
- 增删电子
- 初始化和清空
- 计算距离
- 计算差异
- 调整分组
- 增删朋友
存储分组情况的数据结构改为Set<Map<GameTrack, Set<Athlete>>> ,每个分组的map中GameTrack指向一个Set<Athlete>,即可实现接力赛四人一个跑道的情况。
将轨道中心物体存储在Set<AtomCentralObject>中,可以对AtomCentralObject命名为“Proton”“neutron”来区分质子中子。
设置Map<SocialNetworkCircleTrack, Set<Friend>>存储社交层次到friend的映射,Map<Friend,Set<Friend>> 存储每个人(包括中央用户)的直接朋友关系。