首先我们这是一个小的demo,用来体验实际开发的过程。于是我们需要按照正规流程的简易版进行开发我们的,播放器管理软件。
正规软件开发过程为:需求开发——》体系结构设计——》详细设计——》代码实现——》测试——》
接下来的步骤分为:需求分析——》详细设计——》代码实现(边实现边测试)
一、我们的需求:
播放列表管理:
• 将歌曲添加到主播放列表
• 将歌曲添加到普通播放列表
• 通过歌曲id查询播放列表中的歌曲
• 通过歌曲名称查询播放列表中的歌曲
• 修改播放列表中的歌曲
• 删除播放列表中的歌曲
• 显示播放列表中的所有歌曲
播放器管理:
• 向播放器添加播放列表
• 从播放器删除播放列表
• 通过名字查询播放列表信息
• 显示所有播放列表名称
二、详细设计
我们根据需求可以得知我们需要歌曲类存歌曲对象,播放列表类存播放列表对象,播放列表集合类存多个播放列表,也可称为播放器类,测试类用于测试开发的模块和方法,测试驱动开发
接下来设计每个类的属性和方法
歌曲类(Song):
属性:歌曲id(id)、歌曲名(name)、演唱者(singer),均为字符串类型
方法:
-构造方法
-getter和setter方法
-hashCode()和equals()方法
-toString()方法
播放列表类(PlayList)
属性:播放列表名称(playListName):字符串类型播放列表中的歌曲集合(musicList):List类型
方法:
-构造方法
-getter和setter方法
-将歌曲添加到播放列表:public void addToPlayList(Song song);
-显示播放列表中所有歌曲:public void displayAllSong();
-通过id查询歌曲:public Song searchSongById(String id);
-通过名称查询歌曲:public Song searchSongByName(Stringn);
-修改歌曲:public void updateSong(Stirng id,Song song);
-从播放列表删除歌曲:public void deleteSong(String id);
-按歌曲名进行排序:public void sortBySongName();
播放器类(PlayListCollection)
属性:存放播放列表的集合(playListMap):Map
方法:
-构造方法
-getter和setter方法
-添加播放列表:public void addPlayList(PlayList playList);
-删除播放列表:public void deletePlayList(PlayList playList);
-通过名字查询:public PlayList searchPlayListByName(StringplayListName);
-显示所有播放列表名称:public void displayPlayListName();
测试类 (TestDemo)
三,代码实现
//首先是Song类和其测试代码。
测试代码在TestDemo类中
package SongListTestDemo;
public class Song {
private String id;
private String name;
private String singer;
public Song(String id, String name, String singer) {
this.id = id;
this.name = name;
this.singer = singer;
}
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) {
if (this == obj)
return true;
// this!=obj
if (Song.class != obj.getClass())
return false;
else {
Song other = (Song) obj;
return other.getId().equals(getId())
&& other.getName().equals(getName())
&& other.getSinger().equals(getSinger());
}
}
@Override
public String toString() {
return "歌曲 ID为:" + id + ", 歌曲名称为:" + name + ", 歌手为:" + singer;
}
}
public class TestDemo {
public void testSong() {// 测试歌曲类
Song s1 = new Song("1", "qqq", "www");
Song s2 = new Song("2", "eeee", "rrr");
Song s3 = new Song("3", "aaa", "dddd");
Song s4 = new Song("3", "aaa", "dddd");
System.out.println(s1);
System.out.println(s4.equals(s3));
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
TestDemo t1 = new TestDemo();
t1.testSong();
}
}
//接下来是PlayList类的实现,和测试它的方法
package SongListTestDemo;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class PlayList {
private String PlayListName;
private List<Song> musicList;
/*
* @param playListName 播放列表的名词
* @param musicList
*/
public PlayList(String playListName) {
PlayListName = playListName;
musicList=new ArrayList<Song>();
}
public String getPlayListName() {
return PlayListName;
}
public void setPlayListName(String playListName) {
PlayListName = playListName;
}
public List<Song> getMusicList() {
return musicList;
}
public void setMusicList(List<Song> musicList) {
this.musicList = musicList;
}
/*
* @param song要添加的歌曲
*/
public void addToPlayList(Song song) {//将歌曲添加到播放列表
boolean flag=false;
for(Song s:musicList){
if(s.equals(song))
{
flag=true;
break;
}
}
if (flag)
System.out.println("已有此歌曲");
else {
musicList.add(song);
System.out.println("已添加");
}
}
public void displayAllSong() {//显示播放列表中所有歌曲
System.out.println("播放列表中的所有歌曲有:");
int size = musicList.size();
if (size == 0) {
System.out.println("此列表无歌曲");
} else {
for (Song s : musicList) {
System.out.println(s.toString());
}
}
}
public Song searchSongById(String id) {//通过ID查询歌曲
for (Song s : musicList) {
if (s.getId().equals(id)) {
return s;
}
}
return null;
}
public Song searchSongByName(String n) {//通过名称查询歌曲
for (Song s : musicList) {
if (s.getName().equals(n)) {
return s;
}
}
return null;
}
public void updateSong(String id,Song song){//修改歌曲
Song song1=searchSongById(id);
if(song1==null){
System.out.println("不存在ID为"+id+"的歌曲");
//System.out.println("是否添加:");
}
else{
// for (Song s : musicList) {
// if (s.getId().equals(id)) {
musicList.remove(song1);
musicList.add(song);
System.out.println("修改成功");
//break;
// }
// }
}
}
public void deleteSong(String id){//从播放列表中删除歌曲
Song song1=searchSongById(id);
if(song1==null){
System.out.println(getPlayListName()+"不存在ID为"+id+"的歌曲");
}
else{
// for (Song s : musicList) {
// if (s.getId().equals(id)) {
musicList.remove(song1);
System.out.println("删除成功");
// break;
// }
// }
}
}
public void exportPlayList(){//导出歌曲
String name="D:\\editor\\mooc_learing\\src\\SongListTestDemo"+PlayListName+".txt";
try {
FileOutputStream fos=new FileOutputStream(name);
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(musicList);
oos.flush();
oos.close();
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public class TestDemo {
public void testSong() {// 测试歌曲类
Song s1 = new Song("1", "qqq", "www");
Song s2 = new Song("2", "eeee", "rrr");
Song s3 = new Song("3", "aaa", "dddd");
Song s4 = new Song("3", "aaa", "dddd");
System.out.println(s1);
System.out.println(s4.equals(s3));
}
public void testPlayList() {// 测试播放列表类
Song s1 = new Song("1", "qqq", "www");
Song s2 = new Song("2", "eeee", "rrr");
Song s3 = new Song("3", "aaa", "dddd");
Song s4 = new Song("3", "aaa", "dddd");
PlayList mainPlayList = new PlayList("主播放列表");
mainPlayList.addToPlayList(s1);
mainPlayList.addToPlayList(s2);
mainPlayList.addToPlayList(s3);
mainPlayList.addToPlayList(s4);
mainPlayList.displayAllSong();
s4.setSinger("asd");
mainPlayList.updateSong("1", s4);
mainPlayList.displayAllSong();
System.out.println("**********");
Song s = mainPlayList.searchSongById("2");
if (s != null) {
System.out.println("根据ID找到的为" + s);
} else
System.out.println("不存在该歌曲");
Song song = mainPlayList.searchSongByName("qqq");
if (song != null) {
System.out.println("根据name找到的为" + song);
} else
System.out.println("不存在该歌曲");
mainPlayList.deleteSong("2");
mainPlayList.displayAllSong();
}
}
//接下来是PlayListCollection类,不写其测试方法了,最后给大家整个的TestDemo类
package SongListTestDemo;
import java.util.HashMap;
import java.util.Map;
public class PlayListCollection {
private Map<String, PlayList> playListMap;//存放播放列表集合
public PlayListCollection(){
this.playListMap = new HashMap<String, PlayList>();
}
public Map<String, PlayList> getPlayListMap() {
return playListMap;
}
public void setPlayListMap(Map<String, PlayList> playListMap) {
this.playListMap = playListMap;
}
public void addPlayList(PlayList playlist) {//添加播放列表
if (playListMap.containsValue(playlist))
System.out.println("列表已存在,SB");
playListMap.put(playlist.getPlayListName(), playlist);
System.out.println("加入成功");
}
/**
*
* @param playlist
*/
public void deletePlayList(PlayList playlist) {//删除播放列表
// if (!playListMap.containsValue(playlist)) {
// System.out.println("无此列表,你看清楚了SBB");
// return;
// } else {
playListMap.remove(playlist.getPlayListName());
System.out.println("删除成功");
// }
}
public PlayList searchPlayListByName(String playListName) {//通过名字查询
if (!playListMap.containsKey(playListName)) {
return null;
} else {
return playListMap.get(playListName);
}
}
public void displayListName() {//显示所有播放列表名称
if (playListMap.isEmpty()) {
System.out.println("空的啊 输出啥啊 傻逼");
return;
} else {
for (String s : playListMap.keySet()) {
System.out.println(s);
}
}
}
}
//最后的TestDemo类,特别长,包括界面,有点简陋哈
package SongListTestDemo;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class TestDemo {
public void testSong() {// 测试歌曲类
Song s1 = new Song("1", "qqq", "www");
Song s2 = new Song("2", "eeee", "rrr");
Song s3 = new Song("3", "aaa", "dddd");
Song s4 = new Song("3", "aaa", "dddd");
System.out.println(s1);
System.out.println(s4.equals(s3));
}
public void testPlayList() {// 测试播放列表类
Song s1 = new Song("1", "qqq", "www");
Song s2 = new Song("2", "eeee", "rrr");
Song s3 = new Song("3", "aaa", "dddd");
Song s4 = new Song("3", "aaa", "dddd");
PlayList mainPlayList = new PlayList("主播放列表");
mainPlayList.addToPlayList(s1);
mainPlayList.addToPlayList(s2);
mainPlayList.addToPlayList(s3);
mainPlayList.addToPlayList(s4);
mainPlayList.displayAllSong();
s4.setSinger("asd");
mainPlayList.updateSong("1", s4);
mainPlayList.displayAllSong();
System.out.println("**********");
Song s = mainPlayList.searchSongById("2");
if (s != null) {
System.out.println("根据ID找到的为" + s);
} else
System.out.println("不存在该歌曲");
Song song = mainPlayList.searchSongByName("qqq");
if (song != null) {
System.out.println("根据name找到的为" + song);
} else
System.out.println("不存在该歌曲");
mainPlayList.deleteSong("2");
mainPlayList.displayAllSong();
}
public void testPlayListCollection() {// 测试播放器类
// 定义主播放列表
Song s1 = new Song("1", "qqq", "www");
Song s2 = new Song("2", "eeee", "rrr");
Song s3 = new Song("3", "aaa", "dddd");
PlayList mainPlayList = new PlayList("主播放列表");
mainPlayList.addToPlayList(s1);
mainPlayList.addToPlayList(s2);
mainPlayList.addToPlayList(s3);
mainPlayList.displayAllSong();
System.out.println("*************");
// 定义新的播放列表
Song s4 = new Song("4", "bbb", "dd");
PlayList PlayList = new PlayList("播放列表1");
PlayList.addToPlayList(s1);
PlayList.addToPlayList(s2);
PlayList.addToPlayList(s3);
PlayList.addToPlayList(s4);
PlayList.displayAllSong();
System.out.println("*********");
PlayListCollection plc = new PlayListCollection();
plc.addPlayList(PlayList);
plc.addPlayList(mainPlayList);
System.out.println("***********");
plc.displayListName();
System.out.println("***********");
PlayList p = plc.searchPlayListByName("播放列表1");
p.displayAllSong();
System.out.println("***********");
plc.deletePlayList(PlayList);
plc.displayListName();
}
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("1: 将歌曲添加到主播放列表");
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 test() {// 主流程的实现
TestDemo td = new TestDemo();
Scanner sc = new Scanner(System.in);
int in = 0, in1 = 0, in2 = 0;
//创建一个播放列表容器(播放器)
PlayListCollection plc=new PlayListCollection();
//创建主播放列表
PlayList mainPLayList=new PlayList("主播放列表");
//将主播放列表添加到播放器
plc.addPlayList(mainPLayList);
PlayList favouritePlayList=null;
while (true) {
td.mainMenu();
System.out.println("输入数字");
in = sc.nextInt();
if (in == 0) {
break;
}
switch (in) {
case 1:
while (true) {
td.playListMenu();
System.out.println("输入数字");
in1 = sc.nextInt();
if (in1 == 9)
break;
switch (in1) {
case 1:
System.out.println("1: 将歌曲添加到主播放列表");
System.out.println("请输入要添加的歌曲数量");
int count =sc.nextInt();
for(int i=1;i<=count;i++){
System.out.println("请输入第"+i+"首歌曲");
System.out.println("歌曲的ID为:");
String strId=sc.next();
System.out.println("歌曲的name为:");
String strName=sc.next();
System.out.println("歌曲的singer为:");
String strSinger=sc.next();
Song s=new Song(strId,strName,strSinger);
mainPLayList.addToPlayList(s);
}
mainPLayList.displayAllSong();
break;
case 2:
System.out.println("2: 将歌曲添加到其他播放列表");
System.out.println("请输入要添加的列表名称");
String cName=sc.next();
favouritePlayList=plc.searchPlayListByName(cName);
if(favouritePlayList==null){
System.out.println("该播放列表不存在,请先将播放列表添加到播放器中");
}else{
System.out.println("请输入要添加的歌曲数量");
int count1 =sc.nextInt();
for(int i=1;i<=count1;i++){
System.out.println("请输入第"+i+"首歌曲");
System.out.println("歌曲的ID为:");
String strId=sc.next();
Song song=mainPLayList.searchSongById(strId);
if(song==null){
//若歌曲不存在,则创建新的添加,并且添加到主播放列表
System.out.println("该歌曲在主播放列表不存在,继续输入其他信息");
System.out.println("歌曲的name为:");
String strName=sc.next();
System.out.println("歌曲的singer为:");
String strSinger=sc.next();
Song s=new Song(strId,strName,strSinger);
mainPLayList.addToPlayList(s);
favouritePlayList.addToPlayList(s);
}
else{
//歌曲存在则直接添加到新播放列表
System.out.println("该歌曲已存在");
favouritePlayList.addToPlayList(song);
}
}
mainPLayList.displayAllSong();
favouritePlayList.displayAllSong();
}
break;
case 3:
System.out.println("3: 通过歌曲ID查询播放列表歌曲");
System.out.println("请输入要查询的播放列表名称:");
String strPlayListName1=sc.next();
PlayList p=plc.searchPlayListByName(strPlayListName1);
if(p==null){
System.out.println("无此播放列表");
break;
}
else{
System.out.println("请输入歌曲ID:");
String id=sc.next();
Song s=p.searchSongById(id);
if(s==null)
System.out.println("无此歌曲");
else
System.out.println(s.toString());
}
break;
case 4:
System.out.println("4: 通过歌曲名称查询播放列表中的歌曲");
System.out.println("请输入播放列表名称:");
String PLName4=sc.next();
PlayList p4=plc.searchPlayListByName(PLName4);
if(p4==null){
System.out.println("无此播放列表");
break;
}
else{
System.out.println("此播放列表存在,请输入歌曲Name");
String sName4=sc.next();
if((p4.searchSongByName(sName4))!=null){
p4.displayAllSong();
}
else{
System.out.println("此播放列表无该歌曲");
break;
}
}
break;
case 5:
System.out.println("5: 修改播放列表中的歌曲");
System.out.println("请输入播放列表名称");
String name3=sc.next();
PlayList p7=plc.searchPlayListByName(name3);
if(p7==null){
System.out.println("无此播放列表");
break;
}else{
System.out.println("此播放列表存在");
System.out.println("歌曲的ID为:");
String strId5=sc.next();
System.out.println("修改歌曲的name为:");
String strName5=sc.next();
System.out.println("修改歌曲的singer为:");
String strSinger5=sc.next();
Song s5=new Song(strId5,strName5,strSinger5);
Map<String,PlayList> s0=plc.getPlayListMap();
for(PlayList p5:s0.values()){
p5.updateSong(strId5, s5);
}
}
break;
case 6:
System.out.println("6: 删除播放列表中的歌曲");
System.out.println("请输入播放列表名称");
String name2=sc.next();
PlayList p5=plc.searchPlayListByName(name2);
if(p5==null){
System.out.println("无此播放列表");
break;
}
else{
System.out.println("此播放列表存在,请输入歌曲id");
String songid=sc.next();
Song tempSong=p5.searchSongById(songid);
if(tempSong==null){
System.out.println("无此歌曲存在");
break;
}
else{
if(p5.getPlayListName().equals("主播放列表")){
Map<String,PlayList> s6=plc.getPlayListMap();
for(PlayList p6:s6.values()){
p6.deleteSong(songid);
}
}
else{
p5.deleteSong(songid);
}
}
}
break;
case 7:
System.out.println("7: 显示播放列表的所有歌曲");
System.out.println("请输入播放列表名称");
String name=sc.next();
PlayList p2=plc.searchPlayListByName(name);
if(p2==null){
System.out.println("无此播放列表");
break;
}
else{
System.out.println(name+" 该播放列表存在");
p2.displayAllSong();
}
break;
default:
System.out.println("无该操作");
break;
}
}
break;
case 2:
while (true) {
td.playerMenu();
System.out.println("输入数字");
in2 = sc.nextInt();
if (in2 == 9)
break;
switch (in2) {
case 1:
System.out.println("1: 向播放器添加播放列表");
System.out.println("输入要添加的播放列表的名称");
String playerName=sc.next();
//创建一个新的播放列表对象
favouritePlayList=new PlayList(playerName);
//将播放列表添加到播放器map中
plc.addPlayList(favouritePlayList);
break;
case 2:
System.out.println("2: 从播放器删除播放列表");
System.out.println("请输入要删除的播放列表名称");
String strpln=sc.next();
if(strpln.equals("主播放列表")){
System.out.println("主播放列表不能被删除");
break;
}
else{
PlayList pl=plc.searchPlayListByName(strpln);
if(pl==null){
System.out.println("无播放列表");
}
else{
plc.deletePlayList(pl);
}
}
break;
case 3:
System.out.println("3: 通过名字查询播放列表信息");
System.out.println("请输入要查询的播放列表名称");
String name=sc.next();
PlayList p2=plc.searchPlayListByName(name);
if(p2==null){
System.out.println("无此播放列表");
break;
}
else{
System.out.println(name+" 该播放列表存在");
p2.displayAllSong();
}
break;
case 4:
System.out.println("4: 显示所有播放列表名称");
plc.displayListName();
break;
default:
System.out.println("无该操作");
break;
}
}
break;
default:
System.out.println("无该操作");
break;
}
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
TestDemo t1 = new TestDemo();
// t1.testSong();
// t1.testPlayList();
// t1.testPlayListCollection();
t1.test();
}
}
最后宣传下我个人的微信公众号,微信搜索:可及的小屋,有志向整副业,娱乐的程序员们,欢迎您的到来。谢谢。
100G程序员资料,自取哦!!