导学
对于Java的学习,已经进入尾声了。接下来,我们就通过一个综合案例,来体验一下在企业中如何进行项目的开发。本节课程,我们会按照项目需求分析、接口设计、环境搭建、功能模块开发等阶段入手,完成整个项目,并达到上线交付的成果。
需求分析
案例:播放器管理
- 任务:通过控制台实现播放列表管理和播放器管理
- 具体需求:
- 播放列表管理主要功能
- 将歌曲添加到主播放列表
- 将歌曲添加到普通播列表
- 通过歌曲id查询到播放列表中的歌曲
- 通过歌曲名称查询播放列表中的歌曲
- 修改播放列表中的歌曲
- 删除播放列表中的歌曲
- 显示播放列表的所有歌曲
- 播放器管理
- 向播放器添加播放列表
- 从播放器删除播放列表
- 通过名字查询播放列表信息
- 显示所有列表名称
- 播放列表管理主要功能
详细设计:
- 歌曲类(Song)
- 播放列表类(PlayList)
- 播放器类(PlayListCollection)
测试类(TestDemo)
对功能模块进行调用测试,并在主方法中进行调用歌曲类
``` package com.dodoke.player.bean; /**
- 歌曲类(实体类-功能仅仅是提供对一个类的描述)
- @author Dodoke
/
public class Song implements Comparable
{ private String id;//歌曲编号
private String name;
private String singer;//演唱者 public Song(String id, String name, String singer) { super(); this.id = id; this.name = name; this.singer = singer; } public Song() { super(); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSinger() { return singer; } public void setSinger(String singer) { this.singer = singer; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime result + ((id == null) ? 0 : id.hashCode()); result = prime result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((singer == null) ? 0 : singer.hashCode()); return result; } @Override public boolean equals(Object obj) { //判断对象是否相等,相等则返回true if(this == obj) {
return true;
} //this != true if(obj.getClass() == Song.class) {
//类型相同才去进行比较
Song song = (Song)obj;
return (song.getId().equals(this.id)) && (song.getName().equals(this.name)) && (song.getSinger().equals(this.singer));
} return false; } @Override public String toString() { return “歌曲信息:id为” + id + “, 歌曲名称为” + name + “, 演唱者为” + singer; } @Override public int compareTo(Song o) { String name1 = o.getName(); int n = this.name.compareTo(name1); return n; }
- 歌曲类(Song)
}
<a name="4OdaC"></a>
## 播放列表类
package com.dodoke.player.dao; import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.dodoke.player.bean.Song; /**
- 播放列表类(描述和数据操作相关的方法)
@author Dodoke / public class PlayList { /**
播放列表名称 */ private String playListName;
/**
播放列表的歌曲集合 */ private List
musicList; /**
- 在创建播放列表的时候,必须对播放列表命名
@param playListName 播放列表名称 */ public PlayList(String playListName) { super(); this.playListName = playListName; musicList = new ArrayList
(); } /**
- 将歌曲添加到播放列表
@param song 要添加的歌曲 */ public void addToPlayList(Song song) { //要排除重复添加的情况 boolean flag = false; //判断播放列表中歌曲是否存在 for(Song song1 : musicList) {
if(song1.equals(song)) {
flag = true;
break;
}
} if(flag) {
System.out.println("该歌曲已经存在于播放列表中,添加失败!");
} else {
//将歌曲添加到播放列表中
musicList.add(song);
} }
/**
显示播放列表中所有的歌曲 */ public void displayAllSong() { System.out.println(“播放列表中所有歌曲为:”); for(Song song1 : musicList) {
System.out.println(song1);
} }
/**
- 通过歌曲编号查询播放列表中的歌曲
- @param id 歌曲编号
@return 查询到的的歌曲信息 */ public Song searchSongById(String id) { Song song = null; //歌曲编号id唯一 for(Song song1 : musicList) {
String id1 = song1.getId();
if(id1.equals(id)) {
//编号相同,则歌曲就是相同的
song = song1;
break;
}
} return song; }
/**
- 根据歌曲名称查询歌曲
- @param name 歌曲名称
@return 查询的歌曲信息 */ public Song searchSongByName(String name) { Song song = null; for(Song song1 : musicList) {
String name1 = song1.getName();
if(name1.equals(name)) {
//编号相同,则歌曲就是相同的
song = song1;
break;
}
} return song; }
/**
- 修改播放列表中的歌曲信息
- @param id 要修改的歌曲id
@param song 新的歌曲信息 */ public void updateSong(String id, Song song) { Song song1 = searchSongById(id); if(song1 == null) {
System.out.println("没有找到歌曲编号为" + id + "的歌曲信息!");
} else {
//先移除原有的歌曲信息,再对播放列表中的歌曲信息进行重新添加
musicList.remove(song1);
musicList.add(song);
System.out.println("修改成功!");
} }
/**
- 删除播放列表中指定的歌曲信息
@param id 歌曲编号 */ public void deleteSong(String id) { Song song = searchSongById(id); if(song == null) {
System.out.println("没有找到歌曲编号为" + id + "的歌曲信息!");
} else {
musicList.remove(song);
System.out.println("删除成功!");
} }
/**
- 对歌曲名进行排序
*/
public void sortBySongName() {
Collections.sort(musicList);
}
public String getPlayListName() {
return playListName;
}
public void setPlayListName(String playListName) {
this.playListName = playListName;
}
public List
getMusicList() { return musicList; } public void setMusicList(List musicList) { this.musicList = musicList; } }
package com.dodoke.player.dao; import java.util.HashMap; import java.util.Map; import java.util.Set; /**<a name="l252d"></a>
## 播放器类
- 设置该播放器为系统唯一播放器
@author Dodoke / public class Player {
private static Player palyer = new Player();
public static Player getInstance() {
return palyer;
}
Map
map = new HashMap ();;//存放播放列表的集合 key-播放列表名称 value-播放列表 private Player() {
}
/**
- 向播放器中新增播放列表
@param pl 要添加的播放列表 */ public void addPlayList(PlayList pl) { map.put(pl.getPlayListName(), pl); }
/**
- 删除播放列表
@param pl 要删除的播放列表 */ public void deletePlayList(PlayList pl) { map.remove(pl.getPlayListName()); System.out.println(“删除成功!”); }
/**
- 根据播放列表名称查询播放列表
- @param playListName 播放列表名称
@return 播放列表 */ public PlayList searchPlayListByName(String playListName) { PlayList pl = null; //找到map中所有key值得集合 Set
plKeySet = map.keySet(); for(String s : plKeySet) { //当集合中的key与参数相同时,也就是找到了播放列表
if(s.equals(playListName)) {
pl = map.get(s);
}
} return pl; }
/**
显示所有播放列表的名称 */ public void displayListName() { Set
plKeySet = map.keySet(); System.out.println(“播放列表名称为:”); for(String s : plKeySet) { System.out.println(s);
} }
public Map
getMap() { return map; } public void setMap(Map map) { this.map = map; }
}
<a name="ew00y"></a>
## 测试类
package com.dodoke.player.test; import com.dodoke.player.bean.Song; import com.dodoke.player.dao.PlayList; import com.dodoke.player.dao.Player; public class Test { public static void main(String[] args) { Test test = new Test(); test.testPlayer(); }
/**
* 对歌曲类进行测试
*/
public void testSong() {
Song song1 = new Song("s001","两只老虎","小太阳");
Song song2 = new Song("s002","小燕子","风车");
Song song3 = new Song("s003","茉莉花","彩虹");
Song song4 = new Song("s003","茉莉花","彩虹");
//测试toString()方法
System.out.println(song1);
//测试song1和song3是否相等,测试song3和song4是否相等
System.out.println("song1==song3:" + song1.equals(song3));
System.out.println("song3==song4:" + song3.equals(song4));
}
/**
* 对播放列表类进行测试
*/
public void testPlayList() {
Song song1 = new Song("s001","两只老虎","小太阳");
Song song2 = new Song("s002","小燕子","风车");
Song song3 = new Song("s003","茉莉花","彩虹");
Song song4 = new Song("s003","茉莉花","彩虹");
PlayList pl = new PlayList("主播放列表");
pl.addToPlayList(song1);
pl.addToPlayList(song2);
pl.addToPlayList(song3);
pl.addToPlayList(song4);
//显示播放列表内容
pl.displayAllSong();
//通过id查询歌曲信息
Song song = pl.searchSongById("s003");
if(song == null) {
System.out.println("抱歉,没查到");
} else {
System.out.println(song);
}
//通过歌曲名称查询
song = null;
song = pl.searchSongByName("两只老虎");
if(song == null) {
System.out.println("抱歉,没查到");
} else {
System.out.println(song);
}
//修改歌曲信息
Song songnew = new Song("s004","突然的自我","伍佰");
pl.updateSong("s001", songnew);
pl.displayAllSong();
//歌曲排序
pl.sortBySongName();
pl.displayAllSong();
//删除歌曲信息
pl.deleteSong("s002");
pl.displayAllSong();
}
/**
* 对播放器类进行测试
*/
public void testPlayer() {
Song song1 = new Song("s001","两只老虎","小太阳");
Song song2 = new Song("s002","小燕子","风车");
Song song3 = new Song("s003","茉莉花","彩虹");
//创建主播放列表
PlayList mainPlayList = new PlayList("主播放列表");
mainPlayList.addToPlayList(song1);
mainPlayList.addToPlayList(song2);
mainPlayList.addToPlayList(song3);
//定义一个新的播放列表
PlayList pl = new PlayList("流行音乐");
//从主播放列表中获取流行音乐
pl.addToPlayList(mainPlayList.getMusicList().get(0));
pl.addToPlayList(mainPlayList.getMusicList().get(1));
//将两个播放列表添加到播放器中
Player player = Player.getInstance();
player.addPlayList(mainPlayList);
player.addPlayList(pl);
//展示播放列表名字
player.displayListName();
//根据播放列表名称查询播放列表信息,并显示所有歌曲
PlayList plst = player.searchPlayListByName("流行音乐");
plst.displayAllSong();
//删除播放列表信息
System.out.println("删除前:");
player.displayListName();
System.out.println("删除后:");
player.deletePlayList(pl);
player.displayListName();
}
}
<a name="aEOcb"></a>
## 程序运行服务类
package com.dodoke.player.service; import java.util.Scanner; import com.dodoke.player.bean.Song; import com.dodoke.player.dao.PlayList; import com.dodoke.player.dao.Player; /**
- 描述程序运行逻辑
@author Dodoke / public class PlayerService {
/**
主菜单 / public void mainMenu() { System.out.println(“**“); System.out.println(“ 主菜单 “); System.out.println(“ 1—播放列表管理 “); System.out.println(“ 2—播放器管理 “); System.out.println(“ 0—退出 “); System.out.println(“*“); }
/**
播放列表管理菜单 / public void playListMenu() { System.out.println(“**“); System.out.println(“ 播放列表管理菜单 “); System.out.println(“ 1—将歌曲添加到主播放列表 “); System.out.println(“ 2—将歌曲添加到普通播列表 “); System.out.println(“ 3—通过歌曲id查询到播放列表中的歌曲 “); System.out.println(“ 4—通过歌曲名称查询播放列表中的歌曲 “); System.out.println(“ 5—修改播放列表中的歌曲 “); System.out.println(“ 6—删除播放列表中的歌曲 “); System.out.println(“ 7—显示播放列表的所有歌曲 “); System.out.println(“ 9—返回上一级菜单 “); System.out.println(“*“); }
/**
播放器菜单 / public void playerMenu() { System.out.println(“**“); System.out.println(“ 播放器管理菜单 “); System.out.println(“ 1—向播放器添加播放列表 “); System.out.println(“ 2—从播放器删除播放列表 “); System.out.println(“ 3—通过名字查询播放列表信息 “); System.out.println(“ 4—显示所有播放列表名称 “); System.out.println(“ 9—返回上一级菜单 “); System.out.println(“*“); }
/**
- 执行程序逻辑规划
*/
public void player() {
PlayerService plService = new PlayerService();
Scanner sc = new Scanner(System.in);
int input = 0, input1 = 0, input2 = 0;
//创建唯一的播放列表容器(播放器)
Player player = Player.getInstance();
//创建一个播放器自带的主播放列表
PlayList mPlayList = new PlayList(“主播放列表”);
//将主播放列表添加到播放器
player.addPlayList(mPlayList);
//预先设置一个普通播放列表的变量名
PlayList pList = null;
while(true) {
} } }plService.mainMenu();
System.out.println("请输入对应的数字进行操作:");
input = sc.nextInt();//不再进行异常的处理
if(input == 0) {
System.out.println("退出程序!");
break;
}
//针对用户在主菜单输入的数字进行判断处理
switch(input) {
case 1: {
//播放列表管理
while(true) {
plService.playListMenu();
System.out.println("请输入对应的数字进行播放列表管理操作:");
input1 = sc.nextInt();
if(input1 == 9) {
break;
}
switch(input1) {
case 1: {
System.out.println("将歌曲添加到主播放列表!");
System.out.println("请输入要添加的歌曲数量:");
int count = sc.nextInt();
for(int i = 1; i <= count; i++) {
System.out.println("请输入第" + i + "首歌曲");
System.out.println("请输入歌曲id");
String id = sc.next();
System.out.println("请输入歌曲名称");
String name = sc.next();
System.out.println("请输入歌曲演唱者");
String singer = sc.next();
Song song = new Song(id, name, singer);
mPlayList.addToPlayList(song);
}
System.out.println("歌曲添加完毕!");
break;
}
case 2: {
System.out.println("将歌曲添加到普通播放列表!");
System.out.println("请输入要添加的播放列表名称:");
String playListName = sc.next();
//判断播放列表是否在播放器中存在
pList = player.searchPlayListByName(playListName);
if(pList == null) {
System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!");
} else {
System.out.println("请输入要添加的歌曲数量:");
int count = sc.nextInt();
for(int i = 1; i <= count; i++) {
System.out.println("请输入第" + i + "首歌曲");
System.out.println("请输入歌曲id");
//去主播放列表查询歌曲
String id = sc.next();
Song songs = mPlayList.searchSongById(id);
if(songs == null) {
//如果不存在则让用户继续填写歌曲信息,并将歌曲同时添加到主播放列表和普通播放列表(普通播放列表是主播放列表的子集)
System.out.println("该歌曲在主播放列表不存在,继续输入歌曲的其他信息!");
System.out.println("请输入歌曲名称");
String name = sc.next();
System.out.println("请输入歌曲演唱者");
String singer = sc.next();
Song song = new Song(id, name, singer);
pList.addToPlayList(song);
mPlayList.addToPlayList(song);
} else {
//如果存在主播放列表,则直接将歌曲信息添加到普通播放列表
pList.addToPlayList(songs);
System.out.println("主播放列表中已有该歌曲,已将其添加到名为:" + playListName + "的歌单中!");
}
}
System.out.println("歌曲添加完毕!");
}
break;
}
case 3: {
System.out.println("通过歌曲id查询到播放列表中的歌曲");
System.out.println("请输入要查询的播放列表名称:");
String playListName = sc.next();
//判断播放列表是否在播放器中存在
pList = player.searchPlayListByName(playListName);
if(pList == null) {
System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!");
} else {
System.out.println("请输入要查询的歌曲id:");
String id = sc.next();
Song song = pList.searchSongById(id);
if(song == null) {
System.out.println("该歌曲在播放列表" + playListName + "中不存在!");
} else {
System.out.println("歌曲信息为:");
System.out.println(song);
}
}
break;
}
case 4: {
System.out.println("通过歌曲名称查询播放列表中的歌曲");
break;
}
case 5: {
System.out.println("修改播放列表中的歌曲");
break;
}
case 6: {
System.out.println("删除播放列表中的歌曲");
break;
}
case 7: {
System.out.println("显示播放列表的所有歌曲");
System.out.println("请输入要查询的播放列表");
String playListName = sc.next();
PlayList plst = player.searchPlayListByName(playListName);
if(plst == null) {
System.out.println("抱歉,您输入的列表名称没有匹配!");
} else {
plst.displayAllSong();
}
break;
}
default: {
System.out.println("该数字没有对应的操作");
break;
}
}
}
break;//对于死循环明确终止以后,才可以写,否则认为是无用代码
}
case 2: {
//播放器管理
while(true) {
plService.playerMenu();
System.out.println("请输入对应的数字进行播放器管理操作:");
input2 = sc.nextInt();
if(input2 == 9) {
break;
}
switch(input2) {
case 1: {
System.out.println("向播放器添加播放列表!");
System.out.println("请输入要添加的播放列表名称");
String playName = sc.next();
if(playName.equals("主播放列表")) {
System.out.println("主播放列表无需创建!");
} else {
pList = new PlayList(playName);
//将创建好的播放列表对象添加到播放器中
player.addPlayList(pList);
System.out.println("播放列表创建完毕!");
}
break;
}
case 2: {
System.out.println("从播放器删除播放列表!");
System.out.println("请输入要删除的播放列表名称:");
String playListName = sc.next();
if(playListName.equals("主播放列表")) {
System.out.println("抱歉!主播放列表不能删除!");
break;
}
//查询要删除的播放列表是否存在
PlayList pList1 = player.searchPlayListByName(playListName);
if(pList1 == null) {
System.out.println("该播放列表不存在!");
} else {
player.deletePlayList(pList1);
}
break;
}
case 3: {
System.out.println("通过名字查询播放列表信息!");
System.out.println("请输入要查询的播放列表名称:");
String playListName = sc.next();
PlayList pList2 = player.searchPlayListByName(playListName);
if(pList2 == null) {
System.out.println("该播放列表不存在!");
} else {
System.out.println("已查询到该播放列表");
System.out.println("该播放列表名称为:" + playListName);
pList2.displayAllSong();
}
break;
}
case 4: {
System.out.println("显示所有列表名称!");
player.displayListName();
break;
}
default: {
System.out.println("该数字没有对应的操作");
break;
}
}
}
break;
}
default: {
System.out.println("该数字没有对应的操作");
}
}
package com.dodoke.player.controller; import com.dodoke.player.service.PlayerService; /**<a name="jaqHl"></a>
## 控制类
- 控制层-调用程序运行逻辑
@author Dodoke / public class PlayerController {
public static void main(String[] args) {
PlayerService play = new PlayerService();
play.player();
} } ```