2009-01-16 11 views

उत्तर

3

आप this article एडाप्टर के बारे में पढ़ सकते हैं/प्लगेबल पैटर्न:

इस लेख में सामग्री की तालिका:

* 1 Design Patterns 
* 2 Intent of Adapter 
* 3 Motivation 
* 4 Structure 
* 5 Applicability 
* 6 Consequences 
* 7 Implementation 
     o 7.1 Known Uses and Sample Code 
     o 7.2 Related Patterns 
* 8 Conclusions 
* 9 Appendix 
     o 9.1 References 
     o 9.2 Glossary 

उद्धरण:

स्मालटाक एक "प्लगेबल एडाप्टर की अवधारणा प्रस्तुत की "अंतर्निहित इंटरफ़ेस अनुकूलन वाले कक्षाओं का वर्णन करने के लिए। यह रोचक अवधारणा कक्षाओं को को मौजूदा सिस्टम में पेश करने की अनुमति देता है जो कक्षा में विभिन्न इंटरफेस की अपेक्षा कर सकता है। यह तकनीक मॉड्यूल में कक्षा पुन: उपयोग और यहां तक ​​कि परियोजनाओं को बढ़ावा देने में सहायता कर सकती है।

यहाँ एक छोटा सा उदाहरण है:

हम दो वर्गों है - फू & बू है कि कुछ स्ट्रिंग सांत्वना देने आउटपुट। एडाप्टर क्लास क्लाइंट द्वारा आवश्यक इंटरफ़ेस (SaySomething) प्रदान करने के लिए दोनों कक्षाओं के तरीकों को अनुकूलित कर सकता है। ध्यान दें कि इंटरफ़ेस नाम पर कोई निर्भरता नहीं है - हम आसानी से Sayheey और बार्क विधियों दोनों को अनुकूलित कर सकते हैं।

class Foo 
{ 
    public static void SayHey() { Console.WriteLine("Hey!"); } 
} 

class Boo 
{ 
    public static void Bark() { Console.WriteLine("Woof!"); } 
} 

class Adapter 
{ 
    public Action SaySomething { get; private set;} // "pluggable" adapter 

    public Adapter(Action saySomethingAction) 
    { 
     SaySomething = saySomethingAction; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     (new Adapter(Foo.SayHey)).SaySomething(); 
     (new Adapter(Boo.Bark)).SaySomething(); 
    } 
} 
+0

सी # में प्रतिनिधि, समारोह या कार्रवाई के उपयोग मैं उस लेख का उल्लेख किया था के साथ प्राप्त कर सकते हैं। मुझे लगता है कि आप Google के साथ भी खोजते हैं। लेकिन यह स्पष्ट रूप से प्लग करने योग्य एडाप्टर के बारे में समझा नहीं है। यह गोफ बुक का जिक्र कर रहा है जिसे मैंने पढ़ा है। –

+0

लेख का लिंक अब टूट गया है। – miguelbgouveia

13

मैं क्या गूगल परिणामों का एक त्वरित पढ़ने से समझ में आ से, एक प्लगेबल अनुकूलक एक एडाप्टर एक विशिष्ट adaptee के खिलाफ नहीं है कि हार्ड-कोडेड जाता है। सतह (एडाप्टर का अपना इंटरफ़ेस) पर, यह वही है लेकिन यह अलग-अलग इंटरफेस के साथ विभिन्न एडैप्टेस को अनुकूलित कर सकता है।

असल में, यह आप एक अनुकूलक में डालने के लिए जब adaptee (रिसीवर) प्रोटोकॉल प्रतिबिंब का उपयोग करके संकलन समय पर नहीं जाना जाता है की अनुमति देता है: मैं this thread सुंदर व्याख्यात्मक पाया। जब आप एडाप्टर इंस्टेंस बनाते हैं, तो आप इसे कॉल करने के लिए adaptee की विधि का नाम, और किसी भी मेटाडेटा को इनपुट प्रकारों का अनुवाद करने के लिए पास करते हैं। जब एडाप्टर को लक्ष्य इंटरफ़ेस का एक विधि कॉल प्राप्त होता है, तो यह adaptee पर निर्दिष्ट संबंधित विधि पर कॉल करने के लिए प्रतिबिंब का उपयोग करता है।

और this:

व्यूअर की मुख्य जिम्मेदारी डोमेन खुद के बारे में कोई मान्यताओं बनाने के बिना एक डोमेन मॉडल से एक विजेट को भरने के लिए है। जेएफएएस दर्शक में डिलीगेटिंग ऑब्जेक्ट्स तंत्र का उपयोग करता है को उपरोक्त आवश्यकता को लागू करने के लिए प्लग करने योग्य एडाप्टर पैटर्न।

Facehugger in action

Alien से एक facehugger के रूप में समझें; जब यह एक चेहरे को गले लगाता है, तो आप जो देखते हैं वह फेसहगर का पतला हिस्सा है। आप इसे एक छड़ी से दबा सकते हैं और अपनी बाहों (एडाप्टर इंटरफ़ेस) को छेड़छाड़ करने का प्रयास कर सकते हैं। लेकिन चेहरे की विशेषताओं के बावजूद, यह मूल रूप से किसी भी मानव (adaptee) का चेहरा गले लगा सकता है। शायद मैं इसे थोड़ा सा धक्का दे रहा हूं, लेकिन, हे, मुझे एलियन पसंद है।

+1

महान समानता! :) – cschol

0

प्लग करने योग्य एडाप्टर की एक विशिष्ट विशेषता यह है कि क्लाइंट द्वारा निर्दिष्ट विधि और इंटरफ़ेस में मौजूद विधि अलग हो सकती है।

interface Ilegacy 
    { 
     float calculate(int a, int b); 
    } 
    class Legacy : Ilegacy 
    { 
     public float calculate(int a, int b) 
     { 
      return a * b; 
     } 
    } 
    class Adapter 
    { 
     public Func<int, int, float> legacyCalculator; 
     public Adapter() 
     { 
      this.legacyCalculator = new Legacy().calculate; 
     } 
    } 
    class Client 
    { 
     static void Main() 
     { 
      float result = new Adapter().legacyCalculator(5, 6); 
     } 
    } 

यह सामान्य रूप से