mod penyesuai


Corak Penyesuai berfungsi sebagai jambatan antara dua antara muka yang tidak serasi. Corak reka bentuk jenis ini ialah corak struktur, yang menggabungkan fungsi dua antara muka bebas.

Corak ini melibatkan satu kelas yang bertanggungjawab untuk menambah fungsi antara muka bebas atau tidak serasi. Untuk memberikan contoh sebenar, pembaca kad bertindak sebagai penyesuai antara kad memori dan buku nota. Anda memasukkan kad memori ke dalam pembaca kad, kemudian masukkan pembaca kad ke dalam buku nota, supaya kad memori boleh dibaca melalui buku nota.

Kami menunjukkan penggunaan corak penyesuai melalui contoh berikut. Antaranya, peranti pemain audio hanya boleh memainkan fail mp3, dengan menggunakan pemain audio yang lebih canggih untuk memainkan fail vlc dan mp4.

Pengenalan

Niat: Tukar antara muka kelas kepada antara muka lain yang dikehendaki pelanggan. Corak Penyesuai membolehkan kelas berfungsi bersama yang sebaliknya tidak akan berfungsi bersama kerana antara muka yang tidak serasi.

Penyelesaian utama: Penyelesaian utama: Dalam sistem perisian, selalunya perlu untuk meletakkan beberapa "objek sedia ada" ke dalam persekitaran baharu, dan antara muka yang diperlukan oleh persekitaran baharu tidak boleh dipenuhi oleh objek yang sedia ada.

Bila menggunakan: 1 Sistem perlu menggunakan kelas sedia ada, tetapi antara muka jenis ini tidak memenuhi keperluan sistem. 2. Anda ingin mencipta kelas yang boleh digunakan semula untuk bekerja dengan beberapa kelas yang tidak banyak berkaitan antara satu sama lain, termasuk beberapa kelas yang mungkin akan diperkenalkan pada masa hadapan Kelas sumber ini tidak semestinya mempunyai antara muka yang konsisten. 3. Masukkan satu kelas ke dalam kelas lain melalui penukaran antara muka. (Sebagai contoh, harimau dan burung kini mempunyai harimau terbang. Tanpa perlu menambah entiti, tambah penyesuai untuk mengandungi objek harimau dan laksanakan antara muka terbang.)

Cara menyelesaikan: Mewarisi atau bergantung kepada (disyorkan).

Kod kunci: Penyesuai mewarisi atau bergantung pada objek sedia ada untuk mencapai antara muka sasaran yang diingini.

Contoh aplikasi: 1 Perkakas elektrik Amerika ialah 110V dan China ialah 220V diperlukan untuk menukar 110V kepada 220V. 2. JAVA JDK 1.1 menyediakan antara muka Enumeration, dan 1.2 menyediakan antara muka Iterator Jika anda ingin menggunakan 1.2 JDK, anda mesti menukar antara muka Enumeration sistem sebelumnya kepada antara muka Iterator . 3. Jalankan program WINDOWS pada LINUX. 4. jdbc dalam JAVA.

Kelebihan: 1 Mana-mana dua kelas yang tidak berkaitan boleh dijalankan bersama. 2. Penggunaan semula kelas yang lebih baik. 3. Meningkatkan ketelusan kelas. 4. Fleksibiliti yang baik.

Kelemahan: 1. Penggunaan penyesuai yang berlebihan akan menjadikan sistem menjadi sangat kucar-kacir dan sukar untuk difahami secara keseluruhan. Sebagai contoh, adalah jelas bahawa antara muka A dipanggil, tetapi sebenarnya ia disesuaikan secara dalaman dengan pelaksanaan antara muka B Jika ini berlaku terlalu banyak dalam sistem, ia akan sama dengan bencana. Oleh itu, jika tidak perlu, anda boleh membina semula sistem secara langsung tanpa menggunakan penyesuai. 2. Memandangkan JAVA mewarisi paling banyak satu kelas, ia hanya boleh menyesuaikan diri dengan paling banyak satu kelas penyesuai dan kelas sasaran mestilah kelas abstrak.

Senario penggunaan: Jika anda terdorong untuk mengubah suai antara muka sistem yang biasa dijalankan, anda harus mempertimbangkan untuk menggunakan corak penyesuai.

Nota: Penyesuai tidak ditambah semasa reka bentuk terperinci, tetapi untuk menyelesaikan masalah untuk projek dalam perkhidmatan.

Melaksanakan

Kami mempunyai antara muka MediaPlayer dan kelas entiti AudioPlayer yang melaksanakan antara muka MediaPlayer. Secara lalai, AudioPlayer boleh memainkan fail audio dalam format mp3.

Kami mempunyai antara muka lain AdvancedMediaPlayer dan kelas entiti yang melaksanakan antara muka AdvancedMediaPlayer. Kelas ini boleh memainkan fail dalam format vlc dan mp4.

Kami mahu membenarkan AudioPlayer memainkan fail audio dalam format lain. Untuk mencapai fungsi ini, kita perlu mencipta kelas penyesuai MediaAdapter yang melaksanakan antara muka MediaPlayer dan menggunakan objek AdvancedMediaPlayer untuk memainkan format yang diperlukan.

AudioPlayer menggunakan kelas penyesuai MediaAdapter untuk lulus jenis audio yang diperlukan tanpa mengetahui kelas sebenar yang boleh memainkan audio dalam format yang diperlukan. AdapterPatternDemo, kelas demo kami menggunakan kelas AudioPlayer untuk memainkan pelbagai format.

适配器模式的 UML 图

Langkah 1

Buat antara muka untuk pemain media dan pemain media yang lebih maju.

MediaPlayer.java

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

AdvancedMediaPlayer.java

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

Langkah 2

AdvancedMediaPlayer Kelas entiti antara muka.

VlcPlayer.java

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) {
      //什么也不做
   }
}

Mp4Player.java

public class Mp4Player implements AdvancedMediaPlayer{

   @Override
   public void playVlc(String fileName) {
      //什么也不做
   }

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

Langkah 3

Penciptaan Dilaksanakan< Adaptasi kelas untuk antara muka 🎜>MediaPlayer

.

MediaAdapter.java

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);
      }
   }
}
Langkah 4

Buat kelas entiti yang melaksanakan antara muka

MediaPlayer

.

AudioPlayer.java

public class AudioPlayer implements MediaPlayer {
   MediaAdapter mediaAdapter; 

   @Override
   public void play(String audioType, String fileName) {		

      //播放 mp3 音乐文件的内置支持
      if(audioType.equalsIgnoreCase("mp3")){
         System.out.println("Playing mp3 file. Name: "+ fileName);			
      } 
      //mediaAdapter 提供了播放其他文件格式的支持
      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");
      }
   }   
}
Langkah 5

Gunakan AudioPlayer untuk memainkan pelbagai jenis format audio.

AdapterPatternDemo.java

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");
   }
}
Langkah 6

Sahkan output.

rreeee