说在前面
前两篇文章回顾:《第一篇》 《第二篇》
在上次完成大体框架实现后,我们还实现了SkaterService滑手服务的细节,可以说已经为比赛做好了前期准备,接下来这篇文章,我们将按照整个比赛的流程,完成包括报名与公式、正式比赛与文字直播,以及最后获胜选手公布在内的需求细节。
(本文偏新手向,逻辑实现程度较简单,以巩固对象关系和提高结构分析能力为主要目的,本人能力有限,知识浅薄,文章如有错误,欢迎指正啊!)
思维导图
需求如下
测试场景:
目前有四位滑手参赛,如下表格:
姓名 | 性别 | 年龄 | 国籍 |
---|---|---|---|
Eric | male | 19 | America |
Sean | male | 16 | America |
Leticia | female | 14 | Brazil |
ZhangSan | male | 17 | China |
为方便测试,我们为他们统一提供滑板:
板面 | 支架 | 轮子 | 砂纸 | 轴承 |
---|---|---|---|---|
Zero | Thunder | Spitfire | Mob | Bones |
参赛前他们会从以下参赛要求的招式中练习,努力过后他们最终只能够学会三个,成功率均为90%,而没学招式只有10%的成功率(学会招式为随机三个):
招式名称 | 脚位 | 转体 | 基本招 |
---|---|---|---|
normal frontside hardflip | normal | frontside | hardflip |
nollie backside Kickflip | nollie | backside | Kickflip |
fakie frontside bigspin | fakie | frontside | bigspin |
switch 360 ollie | switch | 360 | ollie |
凭借努力,他们的能力在赛前就被赞助商所发现,以下赞助商愿意为他们提供帮助
(每人都能获得最多三个赞助):
NIKE-SB 耐克滑板 | HUF 街头服饰 | SKALUTE 向滑板致敬 | 7-PE 国家赞助七波辉 |
---|
比赛的安排及规则如下:
赛事名称 | 地点 | 时间 |
---|---|---|
SLS街头联盟 | 芝加哥 | 2020年5月14日 |
规则:根据赛事要求的四个招式,每名参赛者按报名顺序,抽签决定所需完成的招式。若失败则直接出局,成功的则留下。如果多名选手都完成招式,则进行下一轮同样的比拼,直到决出最后留下的选手即为胜利者。
测试结果要求:
- 赛前公示比赛赛事信息,以及参赛选手的个人信息。
- 进行赛程的文字直播。
Go on!!
2、赛程服务实现:
首先进行类似模型填充的操作,这些变量用于储存接下来赛程中要用的数据。
public class CompetitionServiceImpl implements CompetitionService {
// 储存报名参加比赛的选手名单
private static List<Skater> competitors = new ArrayList<>();
// 储存赛事相关数据
private Competition competition;
// 滑手服务用来处理比赛中选手会涉及的滑手相关操作
private final SkaterService skaterService;
// 通过构造函数来引入滑手服务
public CompetitionServiceImpl(SkaterService skaterService) {
this.skaterService = skaterService;
}
}
简单方法实现:
下面这些方法的实现,按照语义容易理解其作用,直接上代码!
// 选手报名
public void signForCompetition(Skater skater) {
for (Skater competitor : competitors) {
// 重视重复问题!如果滑手已存在即已报过名,不进行增加
if (skater.getName().equals(competitor.getName())) {
System.out.println("This skater has signed for the competition");
return;
}
}
competitors.add(skater);
}
// 举办比赛,将赛事信息传入
public void holdCompetition(Competition competition) {
this.competition = competition;
}
// 得到选手名单
public List<Skater> getCompetitors () {
return competitors;
}
重点来了!!
postCompetition方法实现
在此方法中,我们需要公示本次比赛的相关信息:赛事本身信息以及选手基本信息。当然,公示内容只要包括这些就够了,形式可以自由发挥。所以这里的主要操作就是取得我们所需的信息,并进行字符串的拼接,从而得到我们想要的格式,打印即可。
这里我选择直接公示比赛基本信息和滑手基本信息的方式,进行打印:
public void postCompetitionInfo() {
// 获得所有选手姓名名单
List<String> names = new ArrayList<>();
for (Skater skater : competitors) {
names.add(skater.getName());
}
// 赛事信息公示
String competitionPost = "本次滑板大赛——" +competition.getName()+"将在"+competition.getPlace()+"于"+competition.getTime()+"举办!";
// 滑手姓名紧接上面的字符串
String namePost ="";
for (int i=0; i< names.size(); i++) {
namePost += names.get(i)+" ";
}
String wholePost = competitionPost+"参赛滑手有:" + namePost + ",望选手准时参赛,祝比赛开展顺利!";
System.out.println(wholePost);
// 列表格式公示选手基本信息,包括姓名、性别、年龄和国籍
System.out.println("选手信息如下:");
for (Skater skater : competitors) {
System.out.println(skater.getName()+" "+skater.getSex()+" "+skater.getAge()+"岁 "+skater.getCountry());
}
}
打印结果如下(这是Test类中初始化滑手数据后才得到的):