Mẫu thiết kế Adapter trong Java

Một giao diện MediaPlayer mặc định chỉ hỗ trợ phát tệp âm thanh định dạng mp3. Tuy nhiên, trong trường hợp hiện tại chúng ta cần mở rộng khả năng để phát các tệp định dạng vlc và mp4.

Làm thế nào để thực hiện điều này?

Chúng ta sẽ sử dụng một giao diện mới tên là AdvancedMediaPlayer, có khả năng xử lý cả hai định dạng vlc và mp4.

Làm sao để tích hợp giao diện AdvancedMediaPlayer vào MediaPlayer?

Đây là lúc chúng ta áp dụng lớp MediaAdapter – lớp này đóng vai trò chuyển đổi giữa hai giao diện không tương thích.

Cuối cùng, lớp AudioPlayer sẽ triển khai giao diện MediaPlayer, còn công việc chuyển đổi sẽ được delegate cho lớp MediaAdapter.

Sơ đồ cấu trúc lớp như sau:

VlcPlayer.java

package com.advance.adapter;

public class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Đang phát tệp vlc. Tên: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {
        // Không làm gì cả
    }
}

Mp4Player.java

package com.advance.adapter;

public class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        // Không làm gì cả
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("Đang phát tệp mp4. Tên: " + fileName);
    }
}

MediaPlayer.java

package com.advance.adapter;

public interface MediaPlayer {
    void play(String audioType, String fileName);
}

MediaAdapter.java

package com.advance.adapter;

public class MediaAdapter implements MediaPlayer {
    private AdvancedMediaPlayer advancedPlayer;

    public MediaAdapter(String audioType) {
        if ("vlc".equalsIgnoreCase(audioType)) {
            advancedPlayer = new VlcPlayer();
        } else if ("mp4".equalsIgnoreCase(audioType)) {
            advancedPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if ("vlc".equalsIgnoreCase(audioType)) {
            advancedPlayer.playVlc(fileName);
        } else if ("mp4".equalsIgnoreCase(audioType)) {
            advancedPlayer.playMp4(fileName);
        }
    }
}

AudioPlayer.java

package com.advance.adapter;

public class AudioPlayer implements MediaPlayer {
    private MediaAdapter adapter;

    @Override
    public void play(String audioType, String fileName) {
        if ("mp3".equalsIgnoreCase(audioType)) {
            System.out.println("Đang phát tệp mp3. Tên: " + fileName);
        } else if ("vlc".equalsIgnoreCase(audioType) || "mp4".equalsIgnoreCase(audioType)) {
            adapter = new MediaAdapter(audioType);
            adapter.play(audioType, fileName);
        } else {
            System.out.println("Định dạng không hợp lệ. " + audioType + " không được hỗ trợ");
        }
    }
}

AdvancedMediaPlayer.java

package com.advance.adapter;

public interface AdvancedMediaPlayer {
    void playVlc(String fileName);
    void playMp4(String fileName);
}

AdapterPatternDemo.java

package com.advance.adapter;

public class AdapterPatternDemo {
    public static void main(String[] args) {
        AudioPlayer player = new AudioPlayer();

        player.play("mp3", "beyond the horizon.mp3");
        player.play("mp4", "alone.mp4");
        player.play("vlc", "far far away.vlc");
        player.play("avi", "mind me.avi");
    }
}

Kết quả chạy chương trình

Đang phát tệp mp3. Tên: beyond the horizon.mp3
Đang phát tệp mp4. Tên: alone.mp4
Đang phát tệp vlc. Tên: far far away.vlc
Định dạng không hợp lệ. avi không được hỗ trợ

Thẻ: Java thiết kế mẫu adapter pattern Giao diện lớp

Đăng vào ngày 2 tháng 9 lúc 03:18