1. چیست الگوی استراتژی

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

2. ویژگی‌ها و مزایای الگوی استراتژی

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

  • کلاس استراتژی می‌تواند به‌صورت مستقل تغییر کند؛ اضافه کردن یک کلاس استراتژی جدید بر روی کد اصلی تاثیری ندارد و با اصل بازبودن-بسته بودن (Open-Closed Principle) سازگار است.
  • مشتریان می‌توانند بر اساس نیازهای خود استراتژی‌های مختلف را انتخاب کنند که با اصل مسئولیت تکی (Single Responsibility Principle) سازگار است.
  • الگوی استراتژی الگوریتم‌ها یا رفتارهای قابل استفاده مجدد فراهم می‌کند و از تکرار کد جلوگیری می‌کند.
  • الگوی استراتژی روش بهتری برای سازماندهی کد فراهم می‌کند و کد را واضح‌تر و آسان‌تر برای نگهداری می‌کند.

3. نمونه‌های استفاده‌های عملی از الگوی استراتژی

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

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

4. پیاده‌سازی الگوی استراتژی در گولانگ

در این بخش، ما الگوی استراتژی را با استفاده از زبان گولانگ پیاده‌سازی خواهیم کرد و نمونه‌ها، نمودارهای کلاس UML و توضیحات کد مناسب را فراهم خواهیم کرد.

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

در زیر، نمودار کلاس UML برای الگوی استراتژی در گولانگ آمده است:

الگوی استراتژی گولانگ

4.2. معرفی نمونه

از نمودار کلاس UML بالا، می‌توانیم سه نقش الگوی استراتژی را ببینیم: رابط استراتژی (Strategy)، کلاس‌های استراتژی محکم (مانند ConcreteStrategyA و ConcreteStrategyB) و کلاس محیط (Context).

در این نمونه، ما انتخاب روش‌های پرداخت برای سفارشات سیستم تجارت الکترونیک را برای توضیح استفاده خواهیم کرد. مشتری بر اساس روش پرداخت مشخص، استراتژی متناظر (ConcreteStrategyA یا ConcreteStrategyB) را انتخاب کرده و سپس متد کلاس محیط را برای انجام پرداخت فراخوانی می‌کند.

4.3. پیاده‌سازی مرحله 1: تعریف رابط استراتژی و کلاس‌های استراتژی محکم

ابتدا، نیاز داریم که یک رابط استراتژی به نام Strategy تعریف کنیم که شامل متد Execute(data interface{}) string برای اجرای استراتژی خاص است.

type Strategy interface {
    Execute(data interface{}) string
}

type ConcreteStrategyA struct{}

func (s *ConcreteStrategyA) Execute(data interface{}) string {
    // منطق اجرای استراتژی خاص A
}

type ConcreteStrategyB struct{}

func (s *ConcreteStrategyB) Execute(data interface{}) string {
    // منطق اجرای استراتژی خاص B
}

4.4. پیاده‌سازی مرحله 2: پیاده‌سازی کلاس محیط

بعداً، نیاز داریم تا کلاس Context را پیاده‌سازی کنیم که شیء استراتژی خاص را بسته‌بندی می‌کند و متد SetStrategy(strategy Strategy) را برای تنظیم شیء استراتژی فراهم می‌کند، همچنین متد ExecuteStrategy(data interface{}) string را برای اجرای استراتژی خاص ارائه می‌دهد.

type Context struct {
    strategy Strategy
}

func (c *Context) SetStrategy(strategy Strategy) {
    c.strategy = strategy
}

func (c *Context) ExecuteStrategy(data interface{}) string {
    if c.strategy == nil {
        // منطق اجرای استراتژی پیش‌فرض
    } else {
        return c.strategy.Execute(data)
    }
}

4.5. پیاده‌سازی مرحله 3: استفاده از الگوی استراتژی برای تکمیل منطق کسب‌وکار واقعی

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

func main() {
    context := &Context{}

    // تنظیم استراتژی مشخص A با استفاده از متد SetStrategy
    context.SetStrategy(&ConcreteStrategyA{})
    result := context.ExecuteStrategy("پرداخت آلی‌پی")

    // تنظیم استراتژی مشخص B با استفاده از متد SetStrategy
    context.SetStrategy(&ConcreteStrategyB{})
    result = context.ExecuteStrategy("پرداخت ویچت")
}

نتیجه

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