1.1 تعریف

الگوی Adapter یک الگوی طراحی ساختاری است که امکان تبدیل رابط یک کلاس به رابط دیگری که توسط مشتری انتظار می‌رود را فراهم می‌کند. الگوی Adapter امکان مشارکت کلاس‌هایی که به دلیل رابط‌های ناسازگار نمی‌توانند با یکدیگر کار کنند، را فراهم می‌کند.

1.2 هدف و اثر

هدف اصلی الگوی Adapter حل مشکل سازگاری بین دو رابط ناسازگار است. با استفاده از یک کلاس آداپتور، این امکان را فراهم می‌کند که کلاس‌های ناسازگار بتوانند با یکدیگر همکاری کرده و یک عملکرد خاص را پیاده‌سازی کنند.

1.3 اصول اساسی الگوی Adapter

  • الگوی Adapter برای کناره‌گیری با کلاس‌های موجود مناسب است هنگامی که به تبدیل یک رابط به رابط دیگر پرداخته می‌شود.
  • الگوی Adapter تبدیل رابط را از طریق ایجاد یک کلاس آداپتور انجام می‌دهد به جای اصلاح کلاس اصلی.
  • الگوی Adapter می‌تواند از طریق کلاس آداپتور یا آداپتور شیء اجرا شود.

2. ویژگی‌ها و مزایای الگوی Adapter

الگوی Adapter دارای ویژگی‌ها و مزایا زیر است:

  • این الگو راه‌حلی برای تبدیل رابط فراهم می‌کند که به کلاس‌های ناسازگار اجازه می‌دهد با یکدیگر کار کنند.
  • می‌تواند انعطاف‌پذیری و مقیاس‌پذیری سیستم را افزایش دهد.
  • می‌تواند از کلاس‌های موجود استفاده مجدد برای کاهش تکرار کدها و هزینه‌های توسعه استفاده کند.
  • راه‌حلی با اتصال منفصل فراهم می‌کند که سیستم را انعطاف‌پذیرتر و آسان‌تر برای نگهداری می‌کند.

3. صحنه‌های کاربردی الگوی Adapter

الگوی Adapter به طور معمول در صحنه‌های کاربردی زیر استفاده می‌شود:

  • وقتی نیاز به استفاده از یک کلاس موجود وجود دارد، اما رابط آن نیازهای را برآورده نمی‌کند.
  • وقتی نیاز به ایجاد یک کلاس قابل استفاده مجدد با رابط‌های ناسازگار وجود دارد.
  • وقتی نیاز به انجام تبدیل رابط بین چند کلاس وجود دارد.

4.1 نمودار کلاس UML

Golang الگوی Adapter

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 تفاوت و ارتباط بین الگوی Adapter و الگوی Bridge

هر دو الگوی Adapter و الگوی Bridge می‌توانند برای حل مشکل رابط بین دو کلاس مختلف استفاده شوند، اما تفاوت اصلی آنها در:

  • الگوی Adapter اصلی بیشتر بر تبدیل سازگاری بین دو رابط موجود تمرکز دارد.
  • الگوی Bridge اصلی بیشتر بر جداسازی انتزاع و پیاده‌سازی تمرکز دارد و از طریق پل بین رابط و کلاس پیاده‌سازی به جداسازی می‌رسد.

5.2 کاربرد الگوی Adapter در معماری میکروسرویس

در یک معماری میکروسرویس، میکروسرویس‌های مختلف ممکن است از رابط‌های مختلف برای ارتباط استفاده کنند. الگوی Adapter می‌تواند به ما کمک کند تا مشکلات سازگاری بین خدمات مختلف را حل کرده و امکان همکاری آنها را فراهم کند.

5.3 کاربرد الگوی Adapter در توسعه جدا شده نرم‌افزاری رابط کاربری و پشتیبانی

در توسعه جدا شده نرم‌افزاری رابط کاربری و پشتیبانی، معمولاً رابط کاربری برای بازیابی داده‌ها از پشتیبانی نیاز دارد، اما رابط‌هایی که توسط پشتیبانی ارائه شده‌اند ممکن است نیازهای رابط کاربری را برآورده نکند. الگوی Adapter می‌تواند به ما کمک کند تا رابط‌های پشتیبانی را به رابط‌های نیازمند رابط کاربری سازگار کند و همکاری بی‌درز میان رابط کاربری و پشتیبانی را به دست بیاورد.