1. ڈیکوریٹر پیٹرن کیا ہے

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

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

ڈیکوریٹر پیٹرن کی خصوصیات اور فوائد میں شامل ہیں:

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

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

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

  • دنیاپن کو دینمیک طریقے سے شامل کرنا
  • کیشنگ کی فعالیت کو دنیاپن سے شامل کرنا
  • دینیاپن کی معلوماتی تصدیق

4. گولانگ میں ڈیکوریٹر پیٹرن کا اطلاق

4.1. یو ایم ایل کلاس ڈائیگرام

Decorator Pattern in Golang

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

اس مثال میں ہمارے پاس ایک کمپوننٹ انٹرفیس اور ایک کنکریٹ کمپوننٹ کلاس ہے جو کمپوننٹ انٹرفیس کا عمل کرتا ہے۔

پھر ہمارے پاس ایک ڈیکوریٹر کلاس ہے، جو کمپوننٹ انٹرفیس کو بھی عمل کرتا ہے۔ ڈیکوریٹر کلاس میں ایک قسم کا کمپوننٹ ممبر موجود ہے۔

دونوں کنکریٹ ڈیکوریٹر A اور کنکریٹ ڈیکوریٹر B کلاسیں ڈیکوریٹر کلاس سے وراثت حاصل کرتی ہیں اور عمل کو بدل کر اضاقیہ خصوصیت فراہم کرتی ہیں۔

4.3. عمل میں لانے کا قدم 1: انٹرفیس اور پیشکش کلاس کی تعریف کریں

type Component interface {
	Operation() string
}

type ConcreteComponent struct {}

func (c *ConcreteComponent) Operation() string {
	return "مخصوص اشیاء کا عمل"
}

4.4. عمل میں لانے کا قدم 2: ڈیکوریٹر کی تعریف

type Decorator struct {
	component Component
}

func (d *Decorator) Operation() string {
	return d.component.Operation()
}

4.5. عمل میں لانے کا قدم 3: ڈیکوریٹر کی تنظیم

type ConcreteDecoratorA struct {
	Decorator
	addedState string
}

func (c *ConcreteDecoratorA) Operation() string {
	c.addedState = "نیا حالت"
	return c.addedState + " " + c.component.Operation()
}

type ConcreteDecoratorB struct {
	Decorator
}

func (c *ConcreteDecoratorB) Operation() string {
	return "مخصوص ڈیکوریٹر B عمل " + c.component.Operation()
}

4.6. عمل میں لانے کا قدم 4: ڈیکوریٹر کا استعمال

func main() {
	component := &ConcreteComponent{}

	decoratorA := &ConcreteDecoratorA{}
	decoratorA.component = component

	decoratorB := &ConcreteDecoratorB{}
	decoratorB.component = decoratorA

	result := decoratorB.Operation()
	fmt.Println(result)
}

5. دیگر ڈیزائن پیٹرن کے ساتھ ڈیکوریٹر پیٹرن کا موازنہ

5.1. وراثت کے ساتھ موازنہ

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

5.2. سٹیٹک پرانکسی پیٹرن کے ساتھ مقابلہ

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

5.3. دائنامک پرانکسی پیٹرن کے ساتھ مقابلہ

ڈیکوریٹر پیٹرن اور دائنامک پرانکسی پیٹرن دونوں آبجیکٹکی فنکشنلیٹی کو رن ٹائم میں توسیع کر سکتے ہیں۔ البتہ، ڈیکوریٹر پیٹرن ایک ایکل آبجیکٹ کو ڈیکوریٹ کرتا ہے، جبکہ دائنامک پرانکسی پیٹرن میں پراکسی آبجیکٹ اور ٹارگٹ آبجیکٹ کے درمیان غیر معاشرتی رسائی شامل ہوتی ہے۔