1. डेकोरेटर पैटर्न क्या है
डेकोरेटर पैटर्न एक संरचनात्मक डिज़ाइन पैटर्न है जो ऑब्जेक्ट को संशोधित किए बिना डायनेमिक रूप से अतिरिक्त सुविधाओं को जोड़ने की अनुमति देता है। यह इसे एक डेकोरेटर क्लास में ओढ़कर, ऑब्जेक्ट की व्यवहार को योग्यता प्रदान करता है कि उसे रनटाइम पर ऑब्जेक्ट की व्यवहार को जोड़ना, संशोधित करना, या उन्हें बढ़ाने की क्षमता प्रदान करे।
2. डेकोरेटर पैटर्न की विशेषताएँ और फायदे
डेकोरेटर पैटर्न की विशेषताओं और फायदों में शामिल हैं:
- ऑब्जेक्ट के कोड को संशोधित किए बिना उसकी कार्यक्षमता को दायनामिक रूप से विस्तारित करना।
- ओपन-क्लोज़ड सिद्धांत का पालन करना, जो डायनामिक रूप से डेकोरेटर जोड़ने और हटाने की अनुमति देता है।
- एक से अधिक डेकोरेटर को जोड़कर उपनगरी फ़ंक्शनालिति विस्तार करने की क्षमता।
- डेकोरेटर को व्यवस्थापित करने की तरीके से आजादी, जो बदलाव स्वतंत्र रूप से किए जा सकते हैं।
3. डेकोरेटर पैटर्न के व्यावहारिक अनुप्रयोग के उदाहरण
डेकोरेटर पैटर्न का सॉफ़्टवेयर विकास में कई व्यावहारिक अनुप्रयोग है, जैसे:
- डायनमिक रूप से लॉगिंग सुविधा जोड़ना
- डायनमिक रूप से कैशिंग सुविधा जोड़ना
- डायनमिक डेटा मान्यता
4. जीओलैंग में डेकोरेटर पैटर्न का कार्यान्वयन
4.1. यूएमएल क्लास डायग्राम
4.2. उदाहरण परिचय
इस उदाहरण में, हमारे पास एक कॉम्पोनेंट इंटरफेस और एक कंक्रीट कॉम्पोनेंट क्लास है, जो कॉम्पोनेंट इंटरफेस का ऑपरेशन मेथड का अंमल करता है।
फिर हमारे पास एक डेकोरेटर क्लास है, जो भी कॉम्पोनेंट इंटरफेस का अंमल करता है। डेकोरेटर क्लास के पास एक कॉम्पोनेंट प्रकार का सदस्य चर होती है।
कंक्रीट डेकोरेटर ए और कंक्रीट डेकोरेटर बी क्लास दोनों डेकोरेटर क्लास से वंसपति होती हैं और ऑपरेशन मेथड को ओवरराइड करके अतिरिक्त कार्यक्षमता का अंमल करती हैं।
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 "निश्चित डेकोरेटर बी ऑपरेशन " + 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. डायनामिक प्रॉक्सी पैटर्न के साथ तुलना
डेकोरेटर पैटर्न और डायनामिक प्रॉक्सी पैटर्न दोनों ऑब्जेक्ट की कार्यक्षमता को रनटाइम पर विस्तारित कर सकते हैं। हालांकि, डेकोरेटर पैटर्न एक एकल ऑब्जेक्ट को सज़्जित करता है, जबकि डायनामिक प्रॉक्सी पैटर्न प्रॉक्सी ऑब्जेक्ट और लक्ष्य ऑब्जेक्ट के बीच अप्रत्यक्ष पहुंच शामिल करता है।