1.1 تعریف

اداپٹر پیٹرن ایک ساختی ڈیزائن پیٹرن ہے جو ایک کلاس کے انٹرفیس کو وہ انٹرفیس میں تبدیل کرنے کا امکان فراہم کرتا ہے جو کلائنٹ کی توقعات کے مطابق ہو۔ ایڈاپٹر پیٹرن کے ذریعے وہ کلاسیں جو غیر مطابقتی انٹرفیس کی وجہ سے ایک ساتھ کام نہیں کر سکتیں، ان کا تعاون کرنا ممکن بناتا ہے۔

1.2 مقصد اور اثرات

اداپٹر پیٹرن کا اصل مقصد دو غیر مطابقتی انٹرفیسوں کے درمیان موافقت کے مسئلے کا حل کرنا ہے۔ ایک ایڈاپٹر کلاس کا استعمال کرکے، یہ غیر مطابقتی کلاسوں کو ایک خاص فعالیت کو نافذ کرنے کے لئے ایک ساتھ کام کرنے کا ممکن بناتا ہے۔

1.3 ایڈاپٹر پیٹرن کے بنیادی اصول

  • جب کسی انٹرفیس کو دوسرے انٹرفیس میں تبدیل کرنا ہو، تو ایڈاپٹر پیٹرن موجودہ کلاسوں کو دیکھ بھال کرنے کے لئے مناسب ہوتا ہے۔
  • ایڈاپٹر پیٹرن موجودہ کلاس کو ترتیب دینے کی بجائے، ایک ایڈاپٹر کلاس بنا کر انٹرفیس کو نافذ کرتا ہے۔
  • ایڈاپٹر پیٹرن کو کلاس ایڈاپٹر یا آبجیکٹ ایڈاپٹر کے ذریعے نافذ کیا جا سکتا ہے۔

2. ایڈاپٹر پیٹرن کی خصوصیات اور فوائد

اداپٹر پیٹرن کی مندرجہ ذیل خصوصیات اور فوائد ہیں:

  • یہ انٹرفیس تبدیلی کا حل فراہم کرتا ہے، جو غیر مطابقتی کلاسوں کو ایک ساتھ کام کرنے دیتا ہے۔
  • یہ نظام کی قابلیت ترتیب اور پھیلاؤ بڑھا سکتا ہے۔
  • یہ موجودہ کلاسوں کو دوبارہ استعمال کرنے کا امکان فراہم کرتا ہے، کوڈ کی نقل و نسخ کم کرتا ہے، اور ترتیب کی فیس سے کمی کرتا ہے۔
  • یہ ایک ڈیزائن کا ہلکا حل فراہم کرتا ہے، جو نظام کو زیادہ قابل ترتیب اور بہتر ترتیب دینے میں مدد فراہم کرتا ہے۔

3. ایڈاپٹر پیٹرن کی درخواست کے سیناریوز

اداپٹر پیٹرن عام طور پر مندرجہ ذیل سیناریوز میں استعمال ہوتا ہے:

  • جب ایک موجودہ کلاس کا استعمال کرنے کی ضرورت ہو، لیکن اس کا انٹرفیس مطالبوں کو نہیں پورا کرتا۔
  • جب ایک دوبارہ استعمال کرنے والی کلاس کو بنانے کی ضرورت ہو جو غیر مطابقتی انٹرفیسوں کے ساتھ کام کر سکتی ہے۔
  • جب متعدد کلاسوں کے درمیان انٹرفیس تبدیلی کرنے کی ضرورت ہو۔

4.1 UML کلاس شکل

گولنگ ایڈاپٹر پیٹرن

4.2 نافذ کرنے والے قدم 1: ایڈاپٹر انٹرفیس کا ڈیزائن

package main

type Target interface {
    Request()
}

4.3 نافذ کرنے والے قدم 2: ایڈاپٹر کلاس کا نافذ

package main

type Adaptee struct {
}

func (a *Adaptee) SpecificRequest() {
    // ایڈاپٹی کلاس کی خاصی فعالیت کو نافذ کریں
}

type Adapter struct {
    adaptee *Adaptee
}

func NewAdapter() *Adapter {
    return &Adapter{adaptee: &Adaptee{}}
}

func (a *Adapter) Request() {
    a.adaptee.SpecificRequest()
}

4.4 نافذ کرنے والے قدم 3: ایڈاپٹر پیٹرن کو کال کرنے والا کلائنٹ کوڈ

package main

func main() {
    adapter := NewAdapter()
    adapter.Request()
}

5.1 ایڈاپٹر پیٹرن اور برج پیٹرن کے درمیان فرق اور تعلق

اداپٹر پیٹرن اور برج پیٹرن دونوں مختلف کلاسوں کے درمیان انٹرفیس مسئلہ حل کرنے کے لئے استعمال کیا جا سکتا ہے، مگر ان کا مخصوص فرق یہ ہے:

  • ایڈاپٹر پیٹرن مرکزی طور پر دو پہلے سے موجودہ انٹرفیسوں کے درمیان موافقت کا تبدیل ہے۔
  • برج پیٹرن مرکزی طور پر تجربہ اور عملی فرق کے علیحدگی پر توجہ دیتا ہے، انٹرفیس اور نافذ کرنے والی کلاس کے درمیان برج کے ذریعے الگ کرکے علیحدگی فراہم کرنے کے ذریعے علیحدگی حاصل کرتا ہے۔

5.2 مائیکروسرویسز ایکیٹیچر میں ایڈاپٹر پیٹرن کا استعمال

مائیکروسرویس ایکیٹیچر میں، مختلف مائیکروسرویسز مختلف انٹرفیس استعمال کر سکتے ہیں۔ ایڈاپٹر پیٹرن ہمیں مختلف خدمات کے درمیان موافقت مسائل کا حل کرنے میں مدد فراہم کرسکتا ہے۔

5.3 ایڈاپٹر پیٹرن کا فرنٹ-اینڈ اور بیک-اینڈ الگ ترتیب میں استعمال

فرنٹ-اینڈ اور بیک-اینڈ الگ ترتیب میں، فرنٹ اینڈ عام طور پر بیک اینڈ سے ڈیٹا حاصل کرنے کی ضرورت ہوتی ہے، لیکن بیک اینڈ کی انکشاف کردہ انٹرفیسیں فرنٹ اینڈ کی مطالبات کو پورا نہیں کرتی ہیں۔ ایڈاپٹر پیٹرن ہمیں بیک اینڈ انٹرفیسز کو فرنٹ اینڈ کی توقعات کے انٹرفیس میں تبدیل کرنے میں مدد فراہم کرسکتا ہے، جس سے فرنٹ اینڈ اور بیک اینڈ کے درمیان بے درد همکاری حاصل ہو سکتی ہے۔