Adapter Pattern

Structural Design Patterns - জাভায় ডিজাইন প্যাটার্ন (Design Patterns in Java) - Java Technologies

298

Adapter Pattern একটি কাঠামোগত ডিজাইন প্যাটার্ন যা Structural Design Pattern শ্রেণিভুক্ত। এটি দুটি অপর্যাপ্ত ইন্টারফেসের মধ্যে একটি সেতু তৈরি করে, যাতে তারা একে অপরের সাথে কাজ করতে পারে। সাধারণভাবে, যখন দুটি ক্লাস বা সিস্টেমের মধ্যে সম্পর্ক স্থাপন করতে হয় এবং তাদের ইন্টারফেসগুলো মেলে না, তখন Adapter Pattern ব্যবহার করা হয়।

Adapter Pattern এর উদ্দেশ্য:

  • এটি object compatibility প্রদান করে, যেখানে একটি ক্লাস অন্য ক্লাসের সাথে একত্রে কাজ করতে পারে, যদিও তাদের ইন্টারফেস একে অপরের সাথে মিলছে না।
  • এটি একটি interface adapter হিসেবে কাজ করে, যা একটি সিস্টেমের ইন্টারফেসের সাথে অন্য সিস্টেমের ইন্টারফেসের অনুপযুক্ততার মধ্যে সেতুবন্ধন তৈরি করে।

Adapter Pattern এর প্রধান অংশ:

  1. Target: এটি একটি সাধারণ ইন্টারফেস যা ক্লায়েন্ট (Client) ব্যবহারের জন্য প্রস্তুত থাকে।
  2. Client: যে ক্লাসটি Adapter Pattern ব্যবহার করে সিস্টেমের ইন্টারফেসের সাথে কাজ করে।
  3. Adaptee: এটি একটি সিস্টেম, যার ইন্টারফেস পরিবর্তন করতে হবে (অথবা তার সাথে মানানসই করা হবে) যাতে এটি ক্লায়েন্টের জন্য উপযুক্ত হয়।
  4. Adapter: এটি মূলত Adaptee এর ইন্টারফেসকে Target ইন্টারফেসে রূপান্তরিত করে, যাতে এটি ক্লায়েন্ট দ্বারা ব্যবহৃত হতে পারে।

Adapter Pattern এর উদাহরণ

ধরা যাক, আমাদের একটি MediaPlayer ক্লাস এবং একটি MediaAdapter ক্লাস তৈরি করতে হবে। এখানে, MediaPlayer একটি সাধারণ ইন্টারফেস যেটি সমস্ত মিডিয়া ফাইল (যেমন mp3, mp4) প্লে করতে সক্ষম। তবে, আমাদের কাছে বিভিন্ন প্লেয়ার যেমন VLC এবং MP4Player এর জন্য আলাদা ইন্টারফেস রয়েছে, যেগুলি MediaPlayer ইন্টারফেসের সাথে কাজ করে না। এখানে Adapter Pattern ব্যবহার করে, আমরা একে অপরের সাথে কাজ করার উপযোগী করে তুলব।

১. Target Interface (MediaPlayer)

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

২. Adaptee Classes (VlcPlayer, Mp4Player)

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

class VlcPlayer implements AdvancedMediaPlayer {
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

    public void playMp4(String fileName) {
        // Do nothing
    }
}

class Mp4Player implements AdvancedMediaPlayer {
    public void playVlc(String fileName) {
        // Do nothing
    }

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

৩. Adapter Class (MediaAdapter)

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

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

৪. Client Code (AudioPlayer)

class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;

    public void play(String audioType, String fileName) {
        // Play the mp3 file
        if(audioType.equalsIgnoreCase("mp3")){
            System.out.println("Playing mp3 file. Name: " + fileName);
        }
        // Use MediaAdapter to play other formats
        else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        }
        else{
            System.out.println("Invalid media type.");
        }
    }
}

৫. Main Method (Test)

public class AdapterPatternTest {
    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");
    }
}

ব্যাখ্যা:

  • MediaPlayer ইন্টারফেস হল Target যা ক্লায়েন্টে ব্যবহৃত হবে।
  • VlcPlayer এবং Mp4Player হলো Adaptee যেগুলির ইন্টারফেস একে অপরের সাথে মেলে না।
  • MediaAdapter ক্লাস Adapter হিসেবে কাজ করছে, এটি AdvancedMediaPlayer এর ইন্টারফেসকে MediaPlayer ইন্টারফেসে রূপান্তরিত করছে।
  • AudioPlayer ক্লাস হচ্ছে ক্লায়েন্ট, যা MediaPlayer ইন্টারফেস ব্যবহার করছে।

আউটপুট:

Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media type.

Adapter Pattern এর সুবিধা

  1. Class Incompatibility: যখন দুটি ক্লাস একে অপরের সাথে কাজ করতে পারে না, তখন তাদের মধ্যে একটি সেতুবন্ধন তৈরি করতে Adapter Pattern ব্যবহার করা হয়।
  2. Reusability: Adapter প্যাটার্ন ব্যবহার করে আপনি ইতিমধ্যে বিদ্যমান ক্লাসের ইন্টারফেসকে নতুন ক্লাসের সাথে কাজ করার জন্য পুনরায় ব্যবহার করতে পারেন।
  3. Code Maintainability: এই প্যাটার্নটি কোডের রক্ষণাবেক্ষণ সহজ করে, কারণ এটি কমপ্লেক্সিটি লুকিয়ে রাখে এবং কোডকে পরিষ্কার রাখে।
  4. Flexibility: এটি আপনি বিভিন্ন সিস্টেমের মধ্যে যে কোন রকমের ইন্টারফেস সম্পর্কিত সমস্যা সমাধান করতে পারেন।

সারাংশ

Adapter Pattern একটি Structural Design Pattern যা একটি ক্লাসের ইন্টারফেসকে অন্য ক্লাসের সাথে উপযুক্ত করে তোলে। এটি এমন ক্ষেত্রগুলোতে ব্যবহৃত হয় যেখানে দুটি সিস্টেম বা ক্লাসের মধ্যে সম্পর্ক স্থাপন করতে গিয়ে ইন্টারফেসের অমিল ঘটে। Adapter প্যাটার্নটি সিস্টেমের মধ্যে সামঞ্জস্য তৈরির জন্য একটি ইন্টারফেসকে অন্য একটি ইন্টারফেসে রূপান্তরিত করে।

Adapter Pattern এর ব্যবহার:

  • Plug-and-play সিস্টেমে, যেখানে নতুন প্লাগইন বা ইন্টারফেস সংযোজন করা হয়।
  • Legacy code অথবা পুরনো সিস্টেমে যেখানে বর্তমান সিস্টেমের সাথে নতুন সিস্টেমের ইন্টারফেস মেলে না।
  • বিভিন্ন ধরনের ড্রাইভার বা মিডিয়া প্লেয়ার সিস্টেমে যেখানে একাধিক প্ল্যাটফর্ম বা ফর্ম্যাটের জন্য সাপোর্ট প্রয়োজন।

Adapter Pattern ব্যবহারের মাধ্যমে সিস্টেমের কার্যক্ষমতা বৃদ্ধি পায় এবং কোডের মধ্যে মেলবন্ধন সৃষ্টির মাধ্যমে সিস্টেমের কার্যকরীতা নিশ্চিত করা যায়।

Content added By
Promotion

Are you sure to start over?

Loading...