面向对象的设计 - 暂停功能

时间:2013-01-20 18:50:57

标签: java oop

我试图突破我的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
    }
}

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

谢谢!

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

我会有一个Song成员变量来跟踪当前播放的歌曲。如果没有播放,则该值将设置为null。当您暂停Song时,如果当前播放的Pause不为空,则只需在Song课程上调用Song方法即可。 Song课程可以跟踪歌曲中的位置(以分钟为单位),并找出简历的工作方式。

答案 2 :(得分:1)

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

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

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