1. زائر پیٹرن کیا ہے
زائر پیٹرن ایک بارویائی ڈیزائن پیٹرن ہے جو ڈیٹا ساخت کو ڈیٹا عملیات سے الگ کرتا ہے، جس سے ڈیٹا پر مختلف عملیات کی اجازت دی جاتی ہے بغیر ڈیٹا ساخت کو تبدیل کیے۔ زائر پیٹرن ڈیٹا ساخت کو عملیات سے الگ کرکے، عملیات کو زیادہ موزون اور بڑھانے کی اجازت دیتا ہے۔
2. زائر پیٹرن کی خصوصیات اور فوائد
خصوصیات:
- ڈیٹا ساخت کو عملیات سے الگ کرتا ہے، مختلف عملیات کو دائمی باندھنے کی یہ اجازت دیتا ہے۔
- نئے عملیات شامل کرنا بہت آسان ہے اور موجودہ کوڈ میں ترمیم کی ضرورت نہیں ہوتی۔
فوائد:
- نئے عملیات شامل کرنا بہت آسان ہے، کھلا-بند کا اصول کا مطابق ہے۔
- ڈیٹا ساخت کو تبدیل کیے بغیر دقیق عملیات کرائے جا سکتے ہیں۔
3. زائر پیٹرن کی عملی استعمال کا مثال
زائر پیٹرن کا عملی استعمال وسیع میں ہوتا ہے، جیسے:
- کمپائلر کے سنٹیکس ٹری تجزیے مرحلے میں، زائر پیٹرن کو مختلف سنٹیکس چیکس اور کوڈ تبدیلی عملیات کو پورا کرنے کے لیے استعمال کیا جا سکتا ہے۔
- ڈیٹا بیس کوئری آپٹمائزر میں، زائر پیٹرن کو سوال ٹری پر مختلف آپٹمائزیشن عملیات کو پورا کرنے کے لیے استعمال کیا جا سکتا ہے۔
4. گولانگ میں زائر پیٹرن کا نمونہ
4.1 UML کلاس ڈائیاگرام
4.2 نمونے کی تعارف
زائر پیٹرن میں مندرجہ ذیل کردار شامل ہیں:
-
Element
ایک انٹرفیس میتھڈAccept
کو منظر کرتا ہے جو زائرز کو قبول کرنے کے لئے ہے۔ -
ConcreteElementA
اورConcreteElementB
کانکریٹ عناصر کلاسیں ہیں جوAccept
میتھڈ پر عمل کرتی ہیں اور اپنے خود کے عملیاتی میتھڈز کو تعریف کرتی ہیں۔ -
Visitor
زائر انٹرفیس ہے جو مخصوص عناصر کا دورہ کرنے کے لئے میتھڈز کو تعریف کرتا ہے۔ -
ConcreteVisitor1
اورConcreteVisitor2
کانکریٹ زائر کلاسیں ہیں جو مخصوص عناصر کا دورہ کرنے کے لئے میتھڈز کو تعریف کرتی ہیں۔
4.3 نمونہ کی تنفیذ قدم 1: زائر انٹرفیس اور کانکریٹ زائرز تعریف کریں
سب سے پہلے، ہمیں زائر انٹرفیس اور کانکریٹ زائر کلاسیں تعریف کرنی ہوں گی:
type Visitor interface {
VisitConcreteElementA(element ConcreteElementA)
VisitConcreteElementB(element ConcreteElementB)
}
type ConcreteVisitor1 struct{}
func (v *ConcreteVisitor1) VisitConcreteElementA(element ConcreteElementA) {
// ConcreteElementA پر عملیات کریں
}
func (v *ConcreteVisitor1) VisitConcreteElementB(element ConcreteElementB) {
// ConcreteElementB پر عملیات کریں
}
type ConcreteVisitor2 struct{}
func (v *ConcreteVisitor2) VisitConcreteElementA(element ConcreteElementA) {
// ConcreteElementA پر عملیات کریں
}
func (v *ConcreteVisitor2) VisitConcreteElementB(element ConcreteElementB) {
// ConcreteElementB پر عملیات کریں
}
4.4 نمونہ کی تنفیذ قدم 2: عنصر انٹرفیس اور کانکریٹ عنصر کلاسیں تعریف کریں
اگلا، ہم عنصر انٹرفیس اور کانکریٹ عنصر کلاسیں تعریف کریں گے:
type Element interface {
Accept(visitor Visitor)
}
type ConcreteElementA struct{}
func (e *ConcreteElementA) Accept(visitor Visitor) {
visitor.VisitConcreteElementA(e)
}
func (e *ConcreteElementA) OperationA() {
// مخصوص عنصر A عمل کے لیے منطق
}
type ConcreteElementB struct{}
func (e *ConcreteElementB) Accept(visitor Visitor) {
visitor.VisitConcreteElementB(e)
}
func (e *ConcreteElementB) OperationB() {
// مخصوص عنصر B عمل کے لیے منطق
}
4.5 نمونہ کی تنفیذ قدم 3: آبجیکٹ ساخت کی تعریف اور کانکریٹ آبجیکٹ ساخت کی تعریف
اگلا، ہم آبجیکٹ ساخت اور کانکریٹ آبجیکٹ ساخت کی تعریف کریں گے:
type ObjectStructure struct {
elements []Element
}
func (os *ObjectStructure) Attach(element Element) {
os.elements = append(os.elements, element)
}
func (os *ObjectStructure) Detach(element Element) {
for i, e := range os.elements {
if e == element {
os.elements = append(os.elements[:i], os.elements[i+1:]...)
break
}
}
}
func (os *ObjectStructure) Accept(visitor Visitor) {
for _, element := range os.elements {
element.Accept(visitor)
}
}
4.6 نمونہ کی تنفیذ قدم 4: آبجیکٹ ساخت میں عنصر رسائی انٹرفیس کا تنفیذ کریں
آبجیکٹ ساخت میں عنصر رسائی انٹرفیس کا تنفیذ کریں، اور رسائی عمل کو زائر کو مندرجہ ذیل ہے:
func (os *ObjectStructure) Accept(visitor Visitor) {
for _, element := range os.elements {
element.Accept(visitor)
}
}
4.7 نفاذ کا مرحلہ 5: وزیٹر پیٹرن استعمال کرنے کے لئے کلائنٹ کوڈ تعین کریں
آخرکار، ہم کلائنٹ کوڈ تعین کرتے ہیں تاکہ وزیٹر پیٹرن استعمال ہو سکے:
func main() {
elementA := &ConcreteElementA{}
elementB := &ConcreteElementB{}
visitor1 := &ConcreteVisitor1{}
visitor2 := &ConcreteVisitor2{}
objectStructure := &ObjectStructure{}
objectStructure.Attach(elementA)
objectStructure.Attach(elementB)
objectStructure.Accept(visitor1)
objectStructure.Accept(visitor2)
}
نتیجہ
وزیٹر پیٹرن کے ذریعے، ہم ڈیٹا ساخت کو ڈیٹا کارروائی سے الگ کرسکتے ہیں، جس سے کارروائی مزید انتہائی پذیر اور وسیع ہو جاتی ہے۔ جب گولینگ میں وزیٹر پیٹرن نافذ کیا جاتا ہے تو ہم انٹرفیس اور فنکشنوں کا مجموعہ استعمال کر کے دویداری باندھن حاصل کر سکتے ہیں، اس طرح سے الگ کرسکتے ہیں۔ وزیٹر پیٹرن عملی صورتوں میں کارآمدی سے لاگو کیا جاسکتا ہے، چاہے وہ ہو سنٹیکس ٹری تجزیہ ہو یا ڈیٹا بیس کوئری کی بہتری۔