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ợ