对于Java的学习,已经进入尾声了。接下来,我们就通过一个综合案例,来体验一下在企业中如何进行项目的开发。本节课程,我们会按照项目需求分析、接口设计、环境搭建、功能模块开发等阶段入手,完成整个项目,并达到上线交付的成果。
综合案例:播放器 - 图10

需求分析

案例:播放器管理

  • 任务:通过控制台实现播放列表管理和播放器管理

    具体需求:

    1. 播放列表管理主要功能
      • 将歌曲添加到主播放列表
      • 将歌曲添加到普通播列表
      • 通过歌曲id查询到播放列表中的歌曲
      • 通过歌曲名称查询播放列表中的歌曲
      • 修改播放列表中的歌曲
      • 删除播放列表中的歌曲
      • 显示播放列表的所有歌曲
    2. 播放器管理
      • 向播放器添加播放列表
      • 从播放器删除播放列表
      • 通过名字查询播放列表信息
      • 显示所有列表名称

        详细设计:

        歌曲类(Song)综合案例:播放器 - 图11

播放列表类(PlayList)综合案例:播放器 - 图12
综合案例:播放器 - 图13
综合案例:播放器 - 图14

播放器类(PlayListCollection)综合案例:播放器 - 图15
综合案例:播放器 - 图16

测试类(TestDemo)

对功能模块进行调用测试,并在主方法中进行调用

歌曲类

  1. package com.dodoke.player.bean;
  2. /**
  3. * 歌曲类(实体类-功能仅仅是提供对一个类的描述)
  4. * @author Dodoke
  5. *
  6. */
  7. public class Song implements Comparable<Song>{
  8. private String id;//歌曲编号
  9. private String name;
  10. private String singer;//演唱者
  11. public Song(String id, String name, String singer) {
  12. super();
  13. this.id = id;
  14. this.name = name;
  15. this.singer = singer;
  16. }
  17. public Song() {
  18. super();
  19. }
  20. public String getId() {
  21. return id;
  22. }
  23. public void setId(String id) {
  24. this.id = id;
  25. }
  26. public String getName() {
  27. return name;
  28. }
  29. public void setName(String name) {
  30. this.name = name;
  31. }
  32. public String getSinger() {
  33. return singer;
  34. }
  35. public void setSinger(String singer) {
  36. this.singer = singer;
  37. }
  38. @Override
  39. public int hashCode() {
  40. final int prime = 31;
  41. int result = 1;
  42. result = prime * result + ((id == null) ? 0 : id.hashCode());
  43. result = prime * result + ((name == null) ? 0 : name.hashCode());
  44. result = prime * result + ((singer == null) ? 0 : singer.hashCode());
  45. return result;
  46. }
  47. @Override
  48. public boolean equals(Object obj) {
  49. //判断对象是否相等,相等则返回true
  50. if(this == obj) {
  51. return true;
  52. }
  53. //this != true
  54. if(obj.getClass() == Song.class) {
  55. //类型相同才去进行比较
  56. Song song = (Song)obj;
  57. return (song.getId().equals(this.id)) && (song.getName().equals(this.name)) && (song.getSinger().equals(this.singer));
  58. }
  59. return false;
  60. }
  61. @Override
  62. public String toString() {
  63. return "歌曲信息:id为" + id + ", 歌曲名称为" + name + ", 演唱者为" + singer;
  64. }
  65. @Override
  66. public int compareTo(Song o) {
  67. String name1 = o.getName();
  68. int n = this.name.compareTo(name1);
  69. return n;
  70. }
  71. }

播放列表类

  1. package com.dodoke.player.dao;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import com.dodoke.player.bean.Song;
  6. /**
  7. * 播放列表类(描述和数据操作相关的方法)
  8. * @author Dodoke
  9. *
  10. */
  11. public class PlayList {
  12. /**
  13. * 播放列表名称
  14. */
  15. private String playListName;
  16. /**
  17. * 播放列表的歌曲集合
  18. */
  19. private List<Song> musicList;
  20. /**
  21. * 在创建播放列表的时候,必须对播放列表命名
  22. * @param playListName 播放列表名称
  23. */
  24. public PlayList(String playListName) {
  25. super();
  26. this.playListName = playListName;
  27. musicList = new ArrayList<Song>();
  28. }
  29. /**
  30. * 将歌曲添加到播放列表
  31. * @param song 要添加的歌曲
  32. */
  33. public void addToPlayList(Song song) {
  34. //要排除重复添加的情况
  35. boolean flag = false;
  36. //判断播放列表中歌曲是否存在
  37. for(Song song1 : musicList) {
  38. if(song1.equals(song)) {
  39. flag = true;
  40. break;
  41. }
  42. }
  43. if(flag) {
  44. System.out.println("该歌曲已经存在于播放列表中,添加失败!");
  45. } else {
  46. //将歌曲添加到播放列表中
  47. musicList.add(song);
  48. }
  49. }
  50. /**
  51. * 显示播放列表中所有的歌曲
  52. */
  53. public void displayAllSong() {
  54. System.out.println("播放列表中所有歌曲为:");
  55. for(Song song1 : musicList) {
  56. System.out.println(song1);
  57. }
  58. }
  59. /**
  60. * 通过歌曲编号查询播放列表中的歌曲
  61. * @param id 歌曲编号
  62. * @return 查询到的的歌曲信息
  63. */
  64. public Song searchSongById(String id) {
  65. Song song = null;
  66. //歌曲编号id唯一
  67. for(Song song1 : musicList) {
  68. String id1 = song1.getId();
  69. if(id1.equals(id)) {
  70. //编号相同,则歌曲就是相同的
  71. song = song1;
  72. break;
  73. }
  74. }
  75. return song;
  76. }
  77. /**
  78. * 根据歌曲名称查询歌曲
  79. * @param name 歌曲名称
  80. * @return 查询的歌曲信息
  81. */
  82. public Song searchSongByName(String name) {
  83. Song song = null;
  84. for(Song song1 : musicList) {
  85. String name1 = song1.getName();
  86. if(name1.equals(name)) {
  87. //编号相同,则歌曲就是相同的
  88. song = song1;
  89. break;
  90. }
  91. }
  92. return song;
  93. }
  94. /**
  95. * 修改播放列表中的歌曲信息
  96. * @param id 要修改的歌曲id
  97. * @param song 新的歌曲信息
  98. */
  99. public void updateSong(String id, Song song) {
  100. Song song1 = searchSongById(id);
  101. if(song1 == null) {
  102. System.out.println("没有找到歌曲编号为" + id + "的歌曲信息!");
  103. } else {
  104. //先移除原有的歌曲信息,再对播放列表中的歌曲信息进行重新添加
  105. musicList.remove(song1);
  106. musicList.add(song);
  107. System.out.println("修改成功!");
  108. }
  109. }
  110. /**
  111. * 删除播放列表中指定的歌曲信息
  112. * @param id 歌曲编号
  113. */
  114. public void deleteSong(String id) {
  115. Song song = searchSongById(id);
  116. if(song == null) {
  117. System.out.println("没有找到歌曲编号为" + id + "的歌曲信息!");
  118. } else {
  119. musicList.remove(song);
  120. System.out.println("删除成功!");
  121. }
  122. }
  123. /**
  124. * 对歌曲名进行排序
  125. */
  126. public void sortBySongName() {
  127. Collections.sort(musicList);
  128. }
  129. public String getPlayListName() {
  130. return playListName;
  131. }
  132. public void setPlayListName(String playListName) {
  133. this.playListName = playListName;
  134. }
  135. public List<Song> getMusicList() {
  136. return musicList;
  137. }
  138. public void setMusicList(List<Song> musicList) {
  139. this.musicList = musicList;
  140. }
  141. }

播放器类

package com.dodoke.player.dao;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
 * 设置该播放器为系统唯一播放器
 * @author Dodoke
 *
 */
public class Player {

    private static Player palyer = new Player();

    public static Player getInstance() {
        return palyer;
    }

    Map<String, PlayList> map = new HashMap<String, PlayList>();;//存放播放列表的集合 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<String> plKeySet = map.keySet();
        for(String s : plKeySet) {
            //当集合中的key与参数相同时,也就是找到了播放列表
            if(s.equals(playListName)) {
                pl = map.get(s);
            }
        }
        return pl;
    }

    /**
     * 显示所有播放列表的名称
     */
    public void displayListName() {
        Set<String> plKeySet = map.keySet();
        System.out.println("播放列表名称为:");
        for(String s : plKeySet) {
            System.out.println(s);
        }
    }

    public Map<String, PlayList> getMap() {
        return map;
    }
    public void setMap(Map<String, PlayList> map) {
        this.map = map;
    }

}

测试类

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();
    }
}

程序运行服务类

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;
/**
 * 控制层-调用程序运行逻辑
 * @author Dodoke
 *
 */
public class PlayerController {

    public static void main(String[] args) {
        PlayerService play = new PlayerService();
        play.player();
    }
}