1. چیستی الگوی پل (Bridge Pattern)

1.1 تعریف و مفهوم

الگوی پل (Bridge Pattern) یا معروف به الگوی پل، نوعی الگوی طراحی ساختاری است که انتزاع و اجرا را از هم جدا می‌کند و به آن‌ها امکان تغییر مستقل را می‌دهد. به عبارت ساده، الگوی پل یک راه‌حل است که انتزاع را از اجرا جدا می‌کند.

1.2 هدف و اثر الگوی پل

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

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

بعضی از ویژگی‌ها و مزایای اصلی الگوی پل عبارتند از:

  • افزایش قابلیت مقیاس‌پذیری سیستم. هر دو بخش انتزاع و اجرا می‌توانند به‌طور مستقل گسترش یابند بدون اثر بر یکدیگر.
  • رعایت اصل باز-بسته (Open/Closed Principle). بخش انتزاع و بخش اجرا به‌طور مستقل می‌توانند گسترش یابند بدون اثر بر یکدیگر.
  • شفافیت جزئیات اجرا به مشتری، امکان مخفی کردن جزئیات اجرایی از کاربر را فراهم می‌کند.

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

  • زمانی که می‌خواهید اجرای یک شیء پیچیده را از انتزاع آن جدا کنید، می‌توان از الگوی پل استفاده کرد. این ممکن است بر کارایی کد موجود تاثیر مثبتی داشته باشد، به ویژه زمانی که برنامه فقط یک بخش از شیء را در زمان اجرا استفاده می‌کند.
  • زمانی که نیاز دارید وضعیت‌های اجرایی خاص را بین چند شیء به اشتراک بگذارید، اما برای کد مشتری، آن‌ها باید به‌عنوان کلاس‌های مستقل ظاهر شوند.

4. پیاده‌سازی الگوی پل در Golang

4.1 معرفی نمودار کلاس UML

الگوی پل در Golang

4.2 مراحل پیاده‌سازی به‌طور دقیق

4.2.1 تعریف رابط نقش انتزاعی

ابتدا ما یک رابط DrawAPI تعریف می‌کنیم. کد خاص به صورت زیر است:

// رابط نقش انتزاعی
type DrawAPI interface {
	DrawACircle(radius, x, y int)
}

4.2.2 پیاده‌سازی کلاس نقش محسوب‌شده

سپس، ما دو کلاس، RedCircle و BlueCircle، را تعریف می‌کنیم که از متدهای رابط DrawAPI پیاده‌سازی می‌کنند:

// کلاس نقش محسوب‌شده
type RedCircle struct {}

func (c *RedCircle) DrawACircle(radius, x, y int) {
    // منطق رسم یک دایره قرمز
}

type BlueCircle struct {}

func (c *BlueCircle) DrawACircle(radius, x, y int) {
    // منطق رسم یک دایره آبی
}

4.2.3 تعریف رابط پل انتزاعی

تعریف رابط Shape:

// رابط پل انتزاعی
type Shape interface {
	Draw()
}

4.2.4 پیاده‌سازی کلاس پل محسوب‌شده

پیاده‌سازی کلاس Circle که رابط Shape را پیاده‌سازی می‌کند و شامل یک شیء از نوع رابط DrawAPI است:

// کلاس پل محسوب‌شده
type Circle struct {
    x, y, radius int
    drawAPI      DrawAPI
}

func (c *Circle) Draw() {
    c.drawAPI.DrawACircle(c.radius, c.x, c.y)
}

4.2.5 مثال فراخوانی مشتری

func main() {
    redCircle := &Circle{100, 100, 10, new(RedCircle)}
    blueCircle := &Circle{100, 100, 10, new(BlueCircle)}

    redCircle.Draw()
    blueCircle.Draw()
}

به این ترتیب، ما الگوی پل را در Golang پیاده‌سازی کرده‌ایم.