Adapter Pattern là một mẫu cấu trúc cho phép các đối tượng có giao diện không tương thích làm việc cùng nhau. Trong bài viết này, chúng ta sẽ tìm hiểu về Mẫu Adapter, các trường hợp sử dụng của nó và cách triển khai nó trong Java.

1.  Adapter Pattern là gì?

Mẫu Adapter được sử dụng để cho phép hai interface không tương thích làm việc cùng nhau. Nó hoạt động như một cầu nối giữa hai interface không tương thích. Mẫu này bao gồm một lớp duy nhất gọi là Adapter, chịu trách nhiệm kết nối các chức năng của các giao diện độc lập hoặc không tương thích.

2. Khi nào nên sử dụng  Adapter Pattern?

  • Khi bạn muốn sử dụng một lớp hiện có, và interface của nó không khớp với interface bạn cần.
  • Khi bạn muốn tái sử dụng một lớp và dùng nó để tương tác với các class khác mà không cùng Interface hoặc class cha)
  • Khi bạn cần sử dụng nhiều lớp con hiện có, nhưng có sự khó khăn trong việc tạo hết toàn bộ  interface (do quá nhiều)  .

--> Kết luận, Adapter Pattern dùng để kết nối giữa các class không có cùng interface hoặc class cha

3. Ví dụ minh họa Adapter Pattern bằng Java:

Hãy xem xét một kịch bản nơi chúng ta có một interface MediaPlayer phát các file âm thanh, và một class VideoPlayer phát các file video. Chúng ta muốn phát cả file âm thanh và file video bằng cách sử dụng interface MediaPlayer. Dưới đây là cách chúng ta có thể làm bằng cách sử dụng Adapter Pattern.

Class diagram:

           +-------------------+
           |   MediaPlayer     |
           +-------------------+
           | + play(String,    |
           |   String)         |
           +-------------------+
                    |
                    |
                    |
       +-------------------------+
       |                         |
       |                         |
+-------------------+  +-------------------+
|    AudioPlayer    |  |   MediaAdapter    |
+-------------------+  +-------------------+
| - mediaAdapter:   |  | - advancedMedia   |
|   MediaAdapter    |  |   Player:         |
|                   |  |   AdvancedMedia   |
|                   |  |   Player          |
+-------------------+  +-------------------+
| + play(String,    |  | + MediaAdapter    |
|   String)         |  |   (String)        |
|                   |  | + play(String,    |
|                   |  |   String)         |
+-------------------+  +-------------------+
                    |
                    |
                    |
      +--------------------------+
      |                          |
      |                          |
+-------------------+  +-------------------+
|AdvancedMediaPlayer|  |     VlcPlayer     |
+-------------------+  +-------------------+
| + playVlc(String) |  | + playVlc(String) |
| + playMp4(String) |  | + playMp4(String) |
+-------------------+  +-------------------+
                    |
                    |
                    |
           +-------------------+
           |     Mp4Player     |
           +-------------------+
           | + playVlc(String) |
           | + playMp4(String) |
           +-------------------+

 

Bước 1: Định nghĩa interface MediaPlayer:

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

 

Bước 2: Tạo class implementation :

public class AudioPlayer implements MediaPlayer {

    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
        // Phát nhạc mặc định
        if(audioType.equalsIgnoreCase("mp3")){
            System.out.println("Playing mp3 file. Name: " + fileName);
        } 
        // Sử dụng MediaAdapter để phát các định dạng khác
        else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        }
        else{
            System.out.println("Invalid media. " + audioType + " format not supported");
        }
    }
}

 

Bước 3: Tạo class Adapter:

public class MediaAdapter implements MediaPlayer {

    AdvancedMediaPlayer advancedMusicPlayer;

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

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

 

Bước 4: Tạo interface và class AdvancedMediaPlayer:

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

public class VlcPlayer implements AdvancedMediaPlayer {

    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);        
    }

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

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("Playing mp4 file. Name: " + fileName);
    }
}

 

Buớc 5: Tạo class Main chạy chương trình

 

public class AdapterPatternDemo {

    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();

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

Chúc các bạn thành công

AutoCode.VN

minhnhatict@gmail.com