我试图突破我的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
}
}
我们假设“歌曲”已包含歌曲的所有元数据。已经描述了方法的所有功能。当我试图实现“暂停”方法时,我被困住了。你会怎么做才能意识到这一点?
谢谢!
答案 0 :(得分:6)
查看state pattern。您将存储播放器的状态。当你点击暂停和播放时,你将知道播放器的状态。
答案 1 :(得分:2)
我会有一个Song
成员变量来跟踪当前播放的歌曲。如果没有播放,则该值将设置为null。当您暂停Song
时,如果当前播放的Pause
不为空,则只需在Song
课程上调用Song
方法即可。 Song
课程可以跟踪歌曲中的位置(以分钟为单位),并找出简历的工作方式。
答案 2 :(得分:1)
在我看来,喜欢播放方法块直到歌曲结束。它是一种完全单线程的设计。当您设计这样的应用程序时,它在播放歌曲时无法对用户输入做出反应(除非您将输入处理程序放入播放循环中)。
在实际应用程序中,play()方法将开始在单独的线程中播放歌曲(许多音频API将为您执行此操作,因此您不必与多线程混合)然后返回,以便应用程序可以在播放歌曲时保持负责。
这样,暂停和恢复方法将与播放歌曲的线程进行交互。