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

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

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

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

  • یہ باریکیوہ حالت کے فیصلہ سازی منطق کو مختلف حالت کلاسوں میں بند کرتا ہے، جس سے کوڈ کی قابلیتوں کو بڑھایا جاتا ہے۔
  • کھلا/بند اصول: نئی حالت کلاسیں شامل کرکے نئی حالتیں آسانی سے شامل کی جا سکتی ہیں۔
  • ہر حالت کلاس دوسرے حالت کلاس کے بغیر آپس میں آزاد ہے، ایک حالت کلاس کو ترتیب دینے سے دوسرے حالت کلاس کے کوڈ پر اثر نہیں ہوتا۔
  • شرطی بیان کی منطق کو سادہ بناتا ہے، کوڈ قابل پڑھائی اور قدرت مندی میں اضافہ کرتا ہے۔

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

اسٹیٹ پیٹرن کا واقعی زندگی میں کئی عملی استعمالات ہیں، جیسے کہ:

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

4. گولانگ میں اسٹیٹ پیٹرن کی تنصیب

4.1 UML کلاس ڈائیگرام

State Pattern in Golang

4.2 مثال کی تشریح

اس مثال میں، ہم ایک سادہ آرڈر حالت کی منجمنٹ سسٹم تنصیب کریں گے۔ آرڈر کے مختلف حالتیں ہیں، مثلاً وصول شدہ، بھیجی گئی، اور موصول ہوئی۔ مختلف حالات کے بنیاد پر آرڈر کے مختلف کارروائیاں اور رویے ہیں۔

4.3 تنصیب کی منفیں نمائش

4.3.1 آرڈر حالت انٹرفیس اور مضمون حالت کلاسوں کی تعریف

// State interface
type State interface {
	Handle(context *Context)
}

// Concrete State Class A
type ConcreteStateA struct {
	name string
}

func (c *ConcreteStateA) Handle(context *Context) {
	fmt.Println("موجودہ حالت ہے:", c.name)
	fmt.Println("حالت A کے لئے مخصوص کارروائی کو انجام دینا...")
context.SetState(&ConcreteStateB{name: "Concrete state B"})
}

// Concrete State Class B
type ConcreteStateB struct {
	name string
}

func (c *ConcreteStateB) Handle(context *Context) {
	fmt.Println("موجودہ حالت ہے:", c.name)
fmt.Println("حالت B کے لئے مخصوص کارروائی کو انجام دینا...")
context.SetState(&ConcreteStateA{name: "Concrete state A"})
}

4.3.2 آرڈر کنٹیکسٹ کلاس اور حالت سوئچنگ میں میتھڈز کی تعریف

// آرڈر کنٹیکسٹ کلاس
type Context struct {
state State
}

// آرڈر کا عمل کریں
func (c *Context) Handle() {
c.state.Handle(c)
}

// حالت ترتیب دیں
func (c *Context) SetState(state State) {
c.state = state
}

4.3.3 مخصوص حالت کلاسوں کے حالت سوئچنگ میتھڈز کی تنصیب

// مخصوص حالت کلاس A کے لئے سوئچنگ میتھڈ
func (c *ConcreteStateA) SwitchStateB(context *Context) {
context.SetState(&ConcreteStateB{name: "Concrete state B"})
}

// مخصوص حالت کلاس B کے لئے سوئچنگ میتھڈ
func (c *ConcreteStateB) SwitchStateA(context *Context) {
context.SetState(&ConcreteStateA{name: "Concrete state A"})
}

4.3.4 اسٹیٹ پیٹرن کا استعمال کرتے ہوئے آرڈر کی حالت کی منجمنت

func main() {
// آرڈر کنٹیکسٹ کو شروع کریں
context := &Context{
state: &ConcreteStateA{name: "Concrete حالت A"},
}

// آرڈر کا عمل کریں
context.Handle()

// حالت تبدیل کریں
context.state.(*ConcreteStateA).SwitchStateB(context) // Concrete حالت B پر سوئچ کریں
context.Handle()

context.state.(*ConcreteStateB).SwitchStateA(context) // مخصوص حالت A پر دوبارہ سوئچ کریں
context.Handle()
}

خلاصہ

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