بخش های اصلی

آموزش الگوهای طراحی

Design Pattern - الگوی Adapter

الگوی Adapter بعنوان پلی میان دو رابط ناسازگار عمل می کنه. این نوع از الگوی طراحی از آن جایی که قابلیت های دو رابطِ ناسازگار مستقل از هم را با هم ترکیب می کنه، زیرگروه الگوی ساختاری (structural) محسوب میشه.

این الگو شامل کلاسی مجزاست که مسئول پیوند دادن ویژگی های رابط های مستقل و ناسازگاره. مثالی از یک دنیای واقعی در این رابطه میتواند یک خواننده ی کارت باشه که بعنوان سازگارکننده ی میان کارت حافظه و لپ تاپ عمل می کنه. زمانی که کارت حافظه را به خواننده ی کارت وصل می کنین و خواننده ی کارت را داخل لپ تاپ وصل می کنین، کارت حافظه توسط لپ تاپ خوانده میشه.

استفاده از الگوی Adapter را از طریق مثالی به شما نشان میدیم که در آن یک دستگاه پخش کننده ی صدا فقط میتواند فایل های mp3 را پخش کنه و قراره از یک پخش کننده ی صدای پیشرفته که قادره فایل های vlc و mp3 را هم پخش کنه استفاده کنه.

پیاده سازی

یک رابطِ MediaPlayer داریم و کلاس concreteای به نام AudioPlayer، رابطِ MediaPlayer را پیاده سازی می کنه. AudioPlayer بصورت پیش فرض فرمت صدای mp3 را پخش می کنه.

رابط دیگه ای به نام AdvancerMediaPlayer داریم و کلاس های Concrete، این رابط را پیاده سازی می کنن. این کلاس ها فایل های با فرمت vlc و MP4 را پخش می کنن.

میخوایم کاری کنیم که AudioPlayer، فرمت های دیگه را هم پخش کنه. برای رسیدن به این امر، یک کلاسِ adapter به نام MediaAdapter ایجاد می کنیم که رابط MediaPlayer را پیاده سازی کنه و از اشیاء AdvancedMediaPlayer برای پخش فرمت های مورد نیاز استفاده کنه.

AudioPlayer از کلاسِ adapter، MediaAdapter برای پاس دادن صدای دلخواه به آن، بدون اطلاع داشتن از کلاس اصلیِ آن که می تواند فرمت دلخواه را پخش کنه، استفاده می کنه.

AdapterPatternDemo، نسخه ی آزمایشیِ کلاس مان از کلاس AudioPlayer برای پخش فرمت های مختلف استفاده می کنه.

adapter pattern uml diagram

مرحله ی 1

ایجاد رابط هایی برای Media Player و Advanced Media Player.

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

مرحله ی 2

ایجاد کلاس های concrete که رابطِ AdvancedMediaPlayer را پیاده سازی می کنن.

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) {
      //do nothing
   }
}

MP4Player.java

public class Mp4Player implements AdvancedMediaPlayer{

   @Override
   public void playVlc(String fileName) {
      //do nothing
   }

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

مرحله ی 3

ایجاد کلاس adapterای که رابطِ 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);
      }
   }
}

مرحله ی 4

ایجاد کلاس concreteای که رابطِ MediaPlayer را پیاده سازی می کنه.

AudioPlayer.java

public class AudioPlayer implements MediaPlayer {
   MediaAdapter mediaAdapter; 

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

      //inbuilt support to play mp3 music files
      if(audioType.equalsIgnoreCase("mp3")){
         System.out.println("Playing mp3 file. Name: " + fileName);			
      } 
      
      //mediaAdapter is providing support to play other file formats
      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");
      }
   }   
}

مرحله ی 5

استفاده از AudioPlayer برای پخش انواع مختلف فرمت های صدا.

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

مرحله ی 6

بررسی خروجی

Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media. avi format not supported
در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش الگوهای طراحی

Learn Design Patterns

سرفصل ها

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد