1. استراتیجی پیٹرن کیا ہے

استراتیجی پیٹرن ایک رفتاری ڈیزائن پیٹرن ہے جو ہمیں مختلف صورتحالات کے بنیاد پر مختلف الگورتھم یا رویے منتخب کرنے کی اجازت دیتا ہے۔ اس نے مختلف الگورتھمز کو الگ الگ استراتیجی کلاسوں میں دبوچا ہوتا ہے اور یہ اجازت دیتا ہے کہ یہ استراتیجی کلاسیں آپس میں قابل تبادل ہوں۔ استراتیجی پیٹرن کا استعمال کرکے، ہم ایک اشیاء کی طرز عمل کو رن ٹائم میں بدل سکتے ہیں بغیر کہ اشیاء کی ڈھانچے کو براہ راست ترتیب دیں۔

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

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

  • استراتیجی کلاس آزادانہ تبدیل ہوسکتا ہے، نئی استراتیجی کلاس شامل کرنے سے اصل کوڈ پر اثرانداز نہیں ہوتا، اوپن-کلوزڈ اصول کے مطابق ہے۔
  • صارفین ضرورت کے مطابق مختلف استراتیجیز کا انتخاب کرسکتے ہیں، فرد مسؤولیت اصول کا مانتی ہے۔
  • استراتیجی پیٹرن قابل دوبارہ استعمال الگورتھمز یا رویے فراہم کرتا ہے، کوڈ کی نقل و نقش سے بچنے کا ذریعہ ہے۔
  • استراتیجی پیٹرن کوڈ کو منظم کرنے کا بہترین طریقہ فراہم کرتا ہے، جس سے کوڈ صاف ہوجاتا ہے اور اسکی مرمت کرنا زیادہ آسان ہوجاتا ہے۔

3. استراتیجی پیٹرن کی عملی اطلاقات کے مثالیں

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

  • مختلف ادائیگی کے طریقے، مثلاً الی پے، وی چیٹ پے وغیرہ۔
  • مختلف ترتیب دینے کے الگورتھمز، مثلاً ببل سورٹ، تیز سورٹ وغیرہ۔
  • مختلف لاگنگ کے طریقے، مثلاً کنسول کی اوٹ پٹ، فائل کی اوٹ پٹ وغیرہ۔

4. گولینگ میں استراتیجی پیٹرن کا نفاذ

اس سیکشن میں، ہم گولینگ کا استعمال کرکے استراتیجی پیٹرن کا نفاذ کریں گے اور مطابقتی مثالیں، UML کلاس خاکہ، اور کوڈ تبصرے فراہم کریں گے۔

4.1. UML کلاس خاکہ

گولینگ میں استراتیجی پیٹرن کا UML کلاس خاکہ مندرجہ ذیل ہے:

Golang Strategy Pattern

4.2. مثال کا تعارف

مندرجہ بالا UML کلاس خاکہ سے ہم دیکھ سکتے ہیں استراتیجی پیٹرن کے تین کردار: استراتیجی انٹرفیس، کنکریٹ استراتیجی کلاسیں (مثلاً 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 {
    // مخصوص استریٹیجی اے کو نافذ کرنے کے لیے منطق
}

type ConcreteStrategyB struct{}

func (s *ConcreteStrategyB) Execute(data interface{}) string {
    // مخصوص استریٹیجی بی کو نافذ کرنے کے لیے منطق
}

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{}

    // Set specific strategy A using the SetStrategy method
    context.SetStrategy(&ConcreteStrategyA{})
    result := context.ExecuteStrategy("Alipay payment")

    // Set specific strategy B using the SetStrategy method
    context.SetStrategy(&ConcreteStrategyB{})
    result = context.ExecuteStrategy("WeChat payment")
}

نتیجہ

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