1

我试图提高我的 OOD 思维。这是我的问题。

假设您要设计一个音乐 mp3 播放器。我上了一个包含播放列表集合的课程。

class Player {
    Map<String, List<Song>> playlists;    // <Name, PlayList>
    public void play (Song song) {
        // decode song
        // play song
    }
    public void play (String playlistName) {
        // play a playlist
        for (Song song : playlists.get(playlistName)) {
            play (song);
        }
    }
    public void stop () {
        // stop playing
    }
    public void pause () {
        // pause, resume playing the last song when hit play again
    }
}

假设“Song”已经包含了歌曲的所有元数据。已经描述了方法的所有功能。当我试图实现“暂停”方法时,我被卡住了。你会怎么做才能意识到这一点?

谢谢!

4

3 回答 3

6

查看状态模式。您将存储播放器的状态。当您点击暂停和播放时,您将知道播放器的状态。

于 2013-01-20T18:57:52.853 回答
2

我会有一个Song成员变量来跟踪当前播放的歌曲。如果没有播放内容,则该值将设置为 null。当您暂停 a时,如果当前正在播放的不是 null Song,您只需调用类Pause上的方法。反过来,班级可以跟踪歌曲的位置(以分钟为单位),并弄清楚简历的工作方式。SongSongSong

于 2013-01-20T18:54:51.303 回答
1

在我看来,播放方法会一直阻塞,直到歌曲完成。它是一个完全单线程的设计。当您这样设计应用程序时,它无法在播放歌曲时对用户输入做出反应(除非您将输入处理程序放入播放循环中)。

在现实世界的应用程序中,play() 方法会开始在单独的线程中播放歌曲(许多音频 API 会为您执行此操作,因此您不必与多线程混合)然后返回,所以应用程序可以在播放歌曲时保持负责。

这样,暂停和恢复方法就会与播放歌曲的线程进行交互。

于 2013-01-20T18:54:53.863 回答