音乐播放器应用程序的低级设计

设计音乐播放器应用程序需要仔细规划和构建组件,以确保无缝、高效的用户体验。

音乐播放器的关键要求

  • 播放功能:播放、暂停、停止和继续播放歌曲。能够播放不同格式的歌曲(例如 MP3、WAV、AAC)。
  • 播放列表管理:创建、更新和删除播放列表。在播放列表中添加和删除歌曲。
  • 搜索:按标题、艺术家或专辑搜索歌曲。
  • 媒体控制:随机播放和重复播放模式。调整音量。
  • 存储:存储歌曲的元数据(例如标题、艺术家、专辑、时长)。从本地存储读取或与在线音乐服务集成。
  • 系统设计概述

    音乐播放器应用程序可以分为以下几个组件:

  • 歌曲:代表单个音乐曲目。
  • 播放列表:管理歌曲集合。
  • 音乐播放器:播放和媒体控制的核心功能。
  • SearchService:支持通过元数据搜索歌曲。
  • StorageService:处理从存储中检索歌曲。
  • 让我们看看每个组件的底层设计和实现。

    1. 歌曲课

    “Song”类代表带有元数据的单个音乐曲目。

    public class Song {
        private String id;
        private String title;
        private String artist;
        private String album;
        private double duration; // in seconds
    
        public Song(String id, String title, String artist, String album, double duration) {
            this.id = id;
            this.title = title;
            this.artist = artist;
            this.album = album;
            this.duration = duration;
        }
    
        // Getters and setters
        public String getId() {
            return id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public String getArtist() {
            return artist;
        }
    
        public String getAlbum() {
            return album;
        }
    
        public double getDuration() {
            return duration;
        }
    }

    2. 播放列表类

    `Playlist` 类管理歌曲集合。它允许添加、删除和获取歌曲。

    import java.util.ArrayList;
    import java.util.List;
    
    public class Playlist {
        private String name;
        private List songs;
    
        public Playlist(String name) {
            this.name = name;
            this.songs = new ArrayList<>();
        }
    
        public void addSong(Song song) {
            songs.add(song);
        }
    
        public void removeSong(Song song) {
            songs.remove(song);
        }
    
        public List getSongs() {
            return songs;
        }
    
        public String getName() {
            return name;
        }
    }

    3. MusicPlayer 类

    `MusicPlayer` 类处理播放、暂停、停止和音量控制等播放功能。

    public class MusicPlayer {
        private Song currentSong;
        private boolean isPlaying;
    
        public void play(Song song) {
            this.currentSong = song;
            this.isPlaying = true;
            System.out.println("Playing: " + song.getTitle() + " by " + song.getArtist());
        }
    
        public void pause() {
            if (isPlaying) {
                isPlaying = false;
                System.out.println("Paused: " + currentSong.getTitle());
            } else {
                System.out.println("No song is currently playing.");
            }
        }
    
        public void stop() {
            if (currentSong != null) {
                System.out.println("Stopped: " + currentSong.getTitle());
                currentSong = null;
                isPlaying = false;
            } else {
                System.out.println("No song is currently playing.");
            }
        }
    
        public void resume() {
            if (currentSong != null && !isPlaying) {
                isPlaying = true;
                System.out.println("Resumed: " + currentSong.getTitle());
            } else {
                System.out.println("No song to resume.");
            }
        }
    }

    4. SearchService 类

    `SearchService` 类允许用户按标题、艺术家或专辑搜索歌曲。

    import java.util.ArrayList;
    import java.util.List;
    
    public class SearchService {
        private List songs;
    
        public SearchService(List songs) {
            this.songs = songs;
        }
    
        public List searchByTitle(String title) {
            List results = new ArrayList<>();
            for (Song song : songs) {
                if (song.getTitle().equalsIgnoreCase(title)) {
                    results.add(song);
                }
            }
            return results;
        }
    
        public List searchByArtist(String artist) {
            List results = new ArrayList<>();
            for (Song song : songs) {
                if (song.getArtist().equalsIgnoreCase(artist)) {
                    results.add(song);
                }
            }
            return results;
        }
    
        public List searchByAlbum(String album) {
            List results = new ArrayList<>();
            for (Song song : songs) {
                if (song.getAlbum().equalsIgnoreCase(album)) {
                    results.add(song);
                }
            }
            return results;
        }
    }

    5. StorageService 类

    `StorageService` 类模拟从本地存储读取歌曲。

    import java.util.ArrayList;
    import java.util.List;
    
    public class StorageService {
        public static List loadSongs() {
            List songs = new ArrayList<>();
            songs.add(new Song("1", "Shape of You", "Ed Sheeran", "Divide", 240));
            songs.add(new Song("2", "Blinding Lights", "The Weeknd", "After Hours", 200));
            songs.add(new Song("3", "Levitating", "Dua Lipa", "Future Nostalgia", 220));
            return songs;
        }
    }

    示例用法

    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            // Load songs from storage
            List songs = StorageService.loadSongs();
    
            // Search service
            SearchService searchService = new SearchService(songs);
            List results = searchService.searchByArtist("Ed Sheeran");
            System.out.println("Songs by Ed Sheeran:");
            for (Song song : results) {
                System.out.println(song.getTitle());
            }
    
            // Play a song
            MusicPlayer musicPlayer = new MusicPlayer();
            musicPlayer.play(songs.get(0));
            musicPlayer.pause();
            musicPlayer.resume();
            musicPlayer.stop();
    
            // Create a playlist
            Playlist playlist = new Playlist("Favorites");
            playlist.addSong(songs.get(1));
            playlist.addSong(songs.get(2));
            System.out.println("Playlist: " + playlist.getName());
            for (Song song : playlist.getSongs()) {
                System.out.println(song.getTitle());
            }
        }
    }

    关键要点

  • 模块化:每个组件都有特定的职责,使系统易于维护和扩展。
  • 可扩展性:该设计可以轻松集成新功能,例如来自在线音乐库的流媒体。
  • 用户体验:支持播放列表、搜索和播放等基本功能。