> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/system-design/design-patterns/adapter-design-pattern.md).

# Adapter Design Pattern

ধরো, তোমার বাসার পুরনো ফ্যানের প্লাগ তিন-পিনের, কিন্তু নতুন সকেট দুই-পিনের। এখন তুমি কী করবে? সরাসরি ফ্যান চালাতে পারবে না, কারণ প্লাগ আর সকেট ম্যাচ করছে না। এই সমস্যা সমাধানের জন্য তুমি একটা অ্যাডাপ্টার (Adapter) ব্যবহার করবে, যা তিন-পিনের প্লাগকে দুই-পিনের সকেটে ফিট করাবে।

ঠিক এইভাবেই, **Adapter Design Pattern** সফটওয়্যারে ব্যবহার করা হয়, যখন আমরা চাই কোনো ইন্টারফেসকে এমনভাবে ব্যবহার করতে, যাতে এটি অন্য কোনো ইন্টারফেসের সাথে সামঞ্জস্যপূর্ণ হয়।

***

### Adapter Design Pattern কী?

Adapter Design Pattern হলো Structural Design Pattern, যা এক ধরনের Bridge বা মধ্যস্থতাকারী হিসেবে কাজ করে। এটি এক ধরনের Wrapper, যা দুটি অসঙ্গতিপূর্ণ (incompatible) ইন্টারফেসকে একসাথে কাজ করতে সাহায্য করে।

### **কখন ব্যবহার করবো?**

* যখন দুটি ভিন্ন ক্লাস বা মডিউল একসাথে কাজ করতে পারে না, কিন্তু তাদের মধ্যে একটা সংযোগ দরকার।
* যখন পুরনো কোড মডিফাই না করেই নতুন কোডের সাথে সামঞ্জস্যপূর্ণ করতে চাই।
* যখন কোনো লাইব্রেরি বা API-এর ইন্টারফেস সরাসরি আমাদের প্রজেক্টের সাথে মিলছে না।

***

### &#x20;Adapter Pattern এর উদাহরণ

ধরা যাক, আমরা একটি পুরনো **PaymentGateway** ব্যবহার করছি, যেখানে `pay()` মেথড আছে। কিন্তু নতুন API-তে `makePayment()` মেথড ব্যবহার করতে হবে। এখন আমরা Adapter Design Pattern ব্যবহার করবো।

{% code lineNumbers="true" %}

```php
<?php

// পুরনো PaymentGateway (Old System)
class OldPaymentGateway {
    public function pay($amount) {
        echo "Paid $amount using Old Payment Gateway\n";
    }
}

// নতুন PaymentGateway (New System)
interface NewPaymentGateway {
    public function makePayment($amount);
}

// Adapter ক্লাস (যা OldPaymentGateway কে নতুন ইন্টারফেসের সাথে মানিয়ে নেবে)
class PaymentAdapter implements NewPaymentGateway {
    private $oldGateway;

    public function __construct(OldPaymentGateway $oldGateway) {
        $this->oldGateway = $oldGateway;
    }

    public function makePayment($amount) {
        // পুরনো পদ্ধতিকে নতুন পদ্ধতির মতো কাজ করানো হচ্ছে
        $this->oldGateway->pay($amount);
    }
}

// Client Code
$oldGateway = new OldPaymentGateway();
$adapter = new PaymentAdapter($oldGateway);
$adapter->makePayment(500);

?>
```

{% endcode %}

এখানে `PaymentAdapter` ক্লাসটি **OldPaymentGateway** কে **NewPaymentGateway** এর সাথে সামঞ্জস্যপূর্ণ করেছে।

***

### Drawbacks / সীমাবদ্ধতা

* অতিরিক্ত ক্লাস তৈরি করতে হয়, যা কোডের জটিলতা বাড়াতে পারে।
* পুরনো এবং নতুন সিস্টেমের মধ্যে অতিরিক্ত Dependency তৈরি হয়।
* Overhead তৈরি করতে পারে, বিশেষ করে যদি অতিরিক্ত অ্যাডাপ্টার লেয়ার থাকে।

***

### Laravel ও Django-তে Adapter Pattern

#### **Laravel (PHP Framework)**

Laravel-এ Adapter Pattern এর ব্যবহার বেশি দেখা যায় **Facades** ও **Service Providers** এ। উদাহরণ:

* Laravel-এর **Database Query Builder** বিভিন্ন ডাটাবেস ড্রাইভারের সাথে কাজ করতে Adapter ব্যবহার করে।
* **Storage (Local, S3, FTP, etc.)** মডিউলেও এটি ব্যবহৃত হয়, যাতে একই কোড দিয়ে বিভিন্ন স্টোরেজ সিস্টেমে ফাইল সংরক্ষণ করা যায়।

#### **Django (Python Framework)**

Django-তে Adapter Pattern মূলত ব্যবহৃত হয় **ORM (Object-Relational Mapping)**-এ, যেখানে বিভিন্ন ডাটাবেস (MySQL, PostgreSQL, SQLite) এর মধ্যে কাজ করার জন্য **Database Backend Adapter** থাকে।

***

Adapter Pattern হলো একটি ব্রিজ যা ভিন্ন ভিন্ন সিস্টেমকে একসাথে কাজ করতে সাহায্য করে। Laravel-এ এটি Facades ও Storage Systems-এ ব্যবহৃত হয়, আর Django-তে এটি ORM ও Database Adapters-এ ব্যবহৃত হয়। এটি কোডকে রিইউজেবল ও ফ্লেক্সিবল করে তোলে, তবে অতিরিক্ত লেয়ার তৈরি করলে পারফরম্যান্স সমস্যা হতে পারে।
