2011-02-25 21 views
8

एडाप्टर डिज़ाइन पैटर्न का उपयोग क्लास (लक्ष्य) के इंटरफेस को किसी अन्य इंटरफ़ेस (एडैप्टे) क्लाइंट की अपेक्षा में बदलने के लिए किया जाता है। एडाप्टर असंगत वर्गों को एक साथ काम करने देता है जो अन्यथा उनके असंगत इंटरफेस के कारण नहीं हो सकता है।एडाप्टर पैटर्न कार्यान्वयन

एडाप्टर पैटर्न दो तरीकों से लागू किया जा सकता है, विरासत (एडाप्टर पैटर्न का वर्ग संस्करण) और संरचना (एडाप्टर पैटर्न का ऑब्जेक्ट संस्करण) द्वारा।

मेरा प्रश्न एडाप्टर पैटर्न के क्लास संस्करण के बारे में है जो विरासत का उपयोग करके लागू किया गया है।

Figure 1:

interface Shape 
{ 
     Rectangle BoundingBox(); 

     Manipulator CreateManipulator(); 
} 

class TextView 
{ 
     public TextView() { } 

     public Point GetOrigin() { } 

     public int GetWidth() { } 

     public int GetHeight() { } 
} 
interface Shape 
{ 
     Rectangle BoundingBox(); 

     Manipulator CreateManipulator(); 
} 

class TextView 
{ 
     public TextView() { } 

     public Point GetOrigin() { } 

     public int GetWidth() { } 

     public int GetHeight() { } 
} 

हम TextShape लागू करने के लिए TextView वर्ग का पुन: उपयोग करना चाहते हैं, TextView, लेकिन इंटरफेस अलग हैं, और इसलिए और आकार की वस्तुओं नहीं किया जा सकता:

यहाँ ड्राइंग संपादक का एक उदाहरण है एक दूसरे के लिए इस्तेमाल किया।

क्या किसी को आकार दृश्य इंटरफ़ेस के अनुरूप टेक्स्ट व्यू क्लास बदलना चाहिए? शायद नहीं।

TextShape आकार के इंटरफ़ेस करने के लिए TextView इंटरफ़ेस अनुकूलित कर सकते हैं दो तरीकों में से एक में,: आकार के इंटरफेस और TextView के कार्यान्वयन (एडाप्टर गपशप के वर्ग संस्करण)

  • इनहेरिट एक TextView उदाहरण रचना द्वारा

    1. TextShiew ऑब्जेक्ट के अंदर और TextView इंस्टेंस (एडाप्टर पैटर्न का ऑब्जेक्ट वर्जन) का उपयोग करके टेक्स्टशिप इंटरफ़ेस को कार्यान्वित करना।

    कक्षा एडाप्टर

    Figure 2:

    interface Shape 
    { 
        Rectangle BoundingBox(); 
    
        Manipulator CreateManipulator(); 
    } 
    
    class TextView 
    { 
        public TextView() { } 
    
        public Point GetOrigin() { } 
    
        public int GetWidth() { } 
    
        public int GetHeight() { } 
    } 
    
    class TextShape : TextView, Shape 
    { 
        public Rectangle BoundingBox() 
        { 
         Rectangle rectangle; 
         int x, y; 
         Point p = GetOrigin(); 
         x = GetWidth(); 
         y = GetHeight(); 
    
         //... 
    
         return rectangle; 
        } 
    
        #region Shape Members 
    
        public Rectangle Shape.BoundingBox() 
        { 
         return new TextBoundingBox(); 
        } 
    
        public Manipulator Shape.CreateManipulator() 
        { 
         return new TextManipulator(); 
        } 
    
        #endregion 
    } 
    
    सवाल :-) के लिए

    अब। क्या टेक्स्टशिप आकार से विरासत में है और विशेष रूप से टेक्स्ट व्यू से वैध "एक" संबंध है? और यदि नहीं, तो क्या यह Liskov's Substitution Principle का उल्लंघन नहीं करता है?

  • +0

    मुझे लगता है कि यह सख्ती से एलएसपी का उल्लंघन नहीं करता है लेकिन क्यों रचनात्मक तरीके का उपयोग नहीं करते? यह अधिक decoupled है। – MatejB

    उत्तर

    4

    यह लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन नहीं करता है जब तक कि आपके पास सबक्लास में कुछ न हो जो इसे इस तरह से व्यवहार करता है जो सुपरक्लास (सुपरक्लास के अनुबंध का उल्लंघन) के लिए समझ में नहीं आता है। यह पाठ्यक्रम का अपूर्ण कोड है, लेकिन मुझे इसका कोई संकेत नहीं दिख रहा है।

    यह Single Responsibility Principle का उल्लंघन कर सकता है, लेकिन मुझे यकीन नहीं है कि एडाप्टर कार्यान्वयन में यह एक बड़ी चिंता है।

    मैं आम तौर पर प्रतिनिधि मार्ग पसंद करता हूं।

    संबंधित मुद्दे