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 に設定されます。を一時停止するときに、現在再生中のが null でない場合は、クラスのメソッドをSong呼び出すだけです。次に、クラスは曲のどこにあるのか (分単位) を追跡し、履歴書がどのように機能するかを把握できます。PauseSongSongSong

于 2013-01-20T18:54:51.303 に答える
1

曲が終わるまでプレイ方法がブロックされているように思えます。完全シングルスレッド設計です。そのようにアプリケーションを設計すると、曲の再生中にユーザー入力に反応できなくなります (再生ループに入力ハンドラーを配置しない限り)。

実際のアプリケーションでは、play() メソッドは別のスレッドで曲の再生を開始し (多くのオーディオ API がそれを実行するため、マルチスレッドを使用する必要はありません)、その後戻ります。曲の再生中にアプリケーションが責任を持ち続けることができること。

そうすれば、一時停止および再開メソッドは、曲を再生するスレッドと対話します。

于 2013-01-20T18:54:53.863 に答える