सॉफ्टवेयर विकास में सबसे महत्वपूर्ण सिद्धांतों में से एक ओपन-क्लोज्ड डिजाइन सिद्धांत है। यह डिजाइन सिद्धांत जोर देता है कि कक्षाएं विस्तार के लिए खुली होनी चाहिए, लेकिन संशोधन के लिए बंद होनी चाहिए। डेकोरेटर डिज़ाइन पैटर्न खुले-बंद डिज़ाइन सिद्धांत का प्रतीक है।
डेकोरेटर डिजाइन पैटर्न के साथ, आप आसानी से एक वर्ग को उसके मौजूदा कोड में बदलाव किए बिना नया व्यवहार देकर उसका विस्तार कर सकते हैं। डेकोरेटर पैटर्न रचना का उपयोग करके गतिशील रूप से रनटाइम पर करता है। इस डिजाइन पैटर्न को व्यवहार का विस्तार करने के लिए वंशानुक्रम का उपयोग करने के लिए एक लचीले विकल्प के रूप में जाना जाता है।
डेकोरेटर डिजाइन पैटर्न कैसे काम करता है?
हालांकि डेकोरेटर पैटर्न इसका एक विकल्प है वर्ग विरासत, यह अपने डिजाइन में वंशानुक्रम के कुछ पहलुओं को शामिल करता है। डेकोरेटर पैटर्न का एक प्रमुख पहलू यह है कि इसके सभी वर्ग प्रत्यक्ष या अप्रत्यक्ष रूप से संबंधित हैं।
एक विशिष्ट डेकोरेटर डिजाइन पैटर्न में निम्नलिखित संरचना होती है:
ऊपर दिए गए वर्ग आरेख से आप देख सकते हैं कि डेकोरेटर पैटर्न में चार प्रमुख वर्ग हैं।
अवयव: यह एक सार वर्ग (या इंटरफ़ेस) है, जो डेकोरेटर पैटर्न के लिए सुपरटेप के रूप में कार्य करता है।
ठोस घटक: ये वे वस्तुएं हैं जिन्हें आप रनटाइम पर विभिन्न व्यवहारों से सजा सकते हैं। वे घटक इंटरफ़ेस से प्राप्त होते हैं और इसके सार कार्यों को लागू करते हैं।
डेकोरेटर: यह वर्ग अमूर्त है और इसमें वही सुपरटेप है जिस वस्तु को यह सजाएगा। क्लास डायग्राम में, आप कंपोनेंट और डेकोरेटर क्लास के बीच दो संबंध देखेंगे। पहला रिश्ता वंशानुक्रम का है; हर डेकोरेटर एक है अवयव। दूसरा संबंध रचना का है; प्रत्येक डेकोरेटर एक (या लपेटता है a) घटक।
कंक्रीटडेकोरेटर: ये व्यक्तिगत सज्जाकार हैं जो एक घटक को एक विशिष्ट व्यवहार देते हैं। आपको ध्यान देना चाहिए कि प्रत्येक कंक्रीट डेकोरेटर में एक आवृत्ति चर होता है जो एक घटक का संदर्भ रखता है।
जावा में डेकोरेटर डिजाइन पैटर्न को लागू करना
एक नमूना पिज्जा ऑर्डरिंग एप्लिकेशन पर्याप्त रूप से प्रदर्शित कर सकता है कि एप्लिकेशन विकसित करने के लिए डेकोरेटर पैटर्न का उपयोग कैसे करें। यह नमूना पिज्जा एप्लिकेशन ग्राहकों को कई टॉपिंग के साथ पिज्जा ऑर्डर करने की अनुमति देता है। डेकोरेटर पैटर्न की पहली श्रेणी पिज्जा इंटरफ़ेस है:
जनताइंटरफेसपिज़्ज़ा{
जनताअमूर्त डोरी विवरण();
जनताअमूर्तदोहरालागत();
}
पिज़्ज़ा इंटरफ़ेस घटक वर्ग है। तो, आप इससे एक या अधिक ठोस वर्ग बना सकते हैं। पिज्जा कंपनी उनके आटे के आधार पर दो मुख्य प्रकार के पिज्जा बनाती है। एक प्रकार के पिज्जा में खमीर का आटा होता है:
जनताकक्षाखमीर क्रस्ट पिज्जाऔजारपिज़्ज़ा{
@Override
जनता डोरी विवरण(){
वापस करना"खमीर से बना पिज़्ज़ा आटा";
}
@Override
जनतादोहरालागत(){
वापस करना18.00;
}
}
यीस्टक्रस्ट पिज्जा पहला ठोस है जावा वर्ग पिज्जा इंटरफ़ेस का। उपलब्ध पिज्जा का अन्य प्रकार फ्लैटब्रेड है:
जनताकक्षाफ्लैटब्रेडक्रस्टपिज़्ज़ाऔजारपिज़्ज़ा{
@Override
जनता डोरी विवरण(){
वापस करना"फ्लैटब्रेड से बना पिज़्ज़ा आटा";
}
@Override
जनतादोहरालागत(){
वापस करना15.00;
}
}
FlatbreadCrustPizza वर्ग दूसरा ठोस घटक है और YeastCrustPizza वर्ग की तरह, यह पिज्जा इंटरफ़ेस के सभी अमूर्त कार्यों को लागू करता है।
सज्जाकार
डेकोरेटर वर्ग हमेशा अमूर्त होता है, इसलिए आप सीधे इससे एक नया उदाहरण नहीं बना सकते। लेकिन विभिन्न सज्जाकारों और उनके द्वारा सजाए जाने वाले घटकों के बीच संबंध स्थापित करना आवश्यक है।
जनताअमूर्तकक्षाटॉपिंग डेकोरेटरऔजारपिज़्ज़ा{
जनता डोरी विवरण(){
वापस करना"अज्ञात टॉपिंग";
}
}
ToppingDecorator वर्ग इस नमूना अनुप्रयोग में डेकोरेटर वर्ग का प्रतिनिधित्व करता है। अब पिज़्ज़ा कंपनी ToppingDecorator क्लास का इस्तेमाल करके कई अलग-अलग टॉपिंग (या डेकोरेटर) बना सकती है। मान लीजिए कि पिज्जा में तीन अलग-अलग प्रकार के टॉपिंग हो सकते हैं, अर्थात् पनीर, पेपरोनी और मशरूम।
पनीर टॉपिंग
जनताकक्षापनीरका विस्तारटॉपिंग डेकोरेटर{
निजी पिज्जा पिज्जा;जनतापनीर(पिज्जा पिज्जा){
यहपिज़्ज़ा = पिज़्ज़ा;
}@Override
जनता डोरी विवरण(){
वापस करना पिज़्ज़ा.विवरण () + ", पनीर टॉपिंग";
}
@Override
जनतादोहरालागत(){
वापस करनापिज़्ज़ा।लागत() + 2.50;
}
}
पेपरोनी टॉपिंग
जनताकक्षापेपरौनीका विस्तारटॉपिंग डेकोरेटर{
निजी पिज्जा पिज्जा;जनतापेपरौनी(पिज्जा पिज्जा){
यहपिज़्ज़ा = पिज़्ज़ा;
}@Override
जनता डोरी विवरण(){
वापस करना पिज़्ज़ा.विवरण () + ", पेपरोनी टॉपिंग";
}
@Override
जनतादोहरालागत(){
वापस करनापिज़्ज़ा।लागत() + 3.50;
}
}
मशरूम टॉपिंग
जनताकक्षामशरूमका विस्तारटॉपिंग डेकोरेटर{
निजी पिज्जा पिज्जा;जनतामशरूम(पिज्जा पिज्जा){
यहपिज़्ज़ा = पिज़्ज़ा;
}
@Override
जनता डोरी विवरण(){
वापस करना पिज़्ज़ा.विवरण () + ", मशरूम टॉपिंग";
}
@Override
जनतादोहरालागत(){
वापस करनापिज़्ज़ा।लागत() + 4.50;
}
}
अब आपके पास डेकोरेटर डिज़ाइन पैटर्न का उपयोग करके लागू किया गया एक सरल एप्लिकेशन है। यदि कोई ग्राहक चीज़ और पेपरोनी के साथ यीस्ट क्रस्ट पिज़्ज़ा ऑर्डर करता है, तो उस परिदृश्य के लिए परीक्षण कोड इस प्रकार दिखेगा:
जनताकक्षामुख्य{
जनतास्थिरखालीपनमुख्य(स्ट्रिंग [] तर्क){
पिज़्ज़ा पिज़्ज़ा1 = नया यीस्टक्रस्ट पिज्जा ();
पिज्जा1 = नया पेपरोनी (पिज़्ज़ा 1);
पिज्जा1 = नया पनीर (पिज़्ज़ा 1);
System.out.println (पिज़्ज़ा 1. विवरण () + " $" + पिज़्ज़ा1.लागत ());
}
}
इस कोड को चलाने से कंसोल में निम्न आउटपुट उत्पन्न होंगे:
जैसा कि आप देख सकते हैं, आउटपुट पिज़्ज़ा के प्रकार के साथ-साथ उसकी कुल लागत बताता है। पिज्जा $18.00 के लिए यीस्ट क्रस्ट पिज्जा के रूप में शुरू हुआ, लेकिन डेकोरेटर पैटर्न के साथ, एप्लिकेशन पिज्जा में नई सुविधाओं और उनकी उचित लागत को जोड़ने में सक्षम था। इस प्रकार, पिज्जा को मौजूदा कोड (यीस्ट क्रस्ट पिज्जा) में बदलाव किए बिना नया व्यवहार देना।
डेकोरेटर पैटर्न के साथ, आप एक ही व्यवहार को किसी वस्तु पर जितनी बार चाहें उतनी बार लागू कर सकते हैं। यदि कोई ग्राहक उस पर सब कुछ और कुछ अतिरिक्त पनीर के साथ पिज्जा ऑर्डर करता है, तो आप इसे दर्शाने के लिए निम्न कोड के साथ मुख्य वर्ग को अपडेट कर सकते हैं:
पिज़्ज़ा पिज़्ज़ा 2 = नया यीस्टक्रस्ट पिज्जा ();
पिज्जा2 = नया पेपरोनी (पिज़्ज़ा 2);
पिज्जा2 = नया पनीर (पिज़्ज़ा 2);
पिज्जा2 = नया पनीर (पिज़्ज़ा 2);
पिज्जा2 = नया मशरूम (पिज़्ज़ा 2);System.out.println (पिज़्ज़ा 2. विवरण () + " $" + पिज़्ज़ा2.लागत ());
अद्यतन अनुप्रयोग कंसोल में निम्न आउटपुट उत्पन्न करेगा:
डेकोरेटर डिज़ाइन पैटर्न का उपयोग करने के लाभ
डेकोरेटर डिज़ाइन पैटर्न का उपयोग करने के दो प्रमुख लाभ सुरक्षा और लचीलेपन हैं। डेकोरेटर पैटर्न आपको पहले से मौजूद सुरक्षित कोड में हस्तक्षेप न करके अधिक सुरक्षित कोड विकसित करने की अनुमति देता है। इसके बजाय यह रचना के माध्यम से मौजूदा कोड का विस्तार करता है। प्रभावी ढंग से नए बग या अनपेक्षित साइड इफेक्ट की शुरूआत को रोकना।
रचना के कारण डेकोरेटर पैटर्न का उपयोग करते समय एक डेवलपर के पास बहुत अधिक लचीलापन होता है। आप मौजूदा कोड को बदले बिना और एप्लिकेशन को बाधित किए बिना, नया व्यवहार जोड़ने के लिए किसी भी समय एक नया डेकोरेटर लागू कर सकते हैं।