2009-01-27 11 views
66

मैं इन दो पैटर्न के बीच अंतर का शोध कर रहा हूं।Façade बनाम मध्यस्थ

मैं समझता हूं कि मुखौटा एक उप प्रणाली तक पहुंच को समाहित करता है और मध्यस्थ घटक के बीच बातचीत को समाहित करता है।

मैं समझता हूं कि उप सिस्टम घटक मुखौटे से अवगत नहीं हैं, जहां घटक मध्यस्थ के बारे में स्पष्ट रूप से अवगत हैं।

मैं वर्तमान में कॉन्फ़िगरेशन जानकारी पुनर्प्राप्त करने की विधि को समाहित करने के लिए एक मुखौटा का उपयोग कर रहा हूं, उदा। App.Config, एसक्यूएल, असेंबली जानकारी, आदि में संग्रहीत उपयोगकर्ता सेटिंग, और विभिन्न विंडोज़ फॉर्मों के बीच नेविगेशन के लिए मध्यस्थ।

हालांकि, अधिकांश साइटें इंगित करती हैं कि मध्यस्थ "कार्यक्षमता जोड़ता है"। इसका मतलब क्या है? मध्यस्थ कैसे कार्यक्षमता जोड़ता है?

उत्तर

85

... सबसे साइटों का कहना है कि मध्यस्थ "कार्यक्षमता जोड़ता" ...

मुखौटा केवल एक अलग नजरिए से मौजूदा कार्यक्षमता को उजागर करता है।

मध्यस्थ कार्यक्षमता "जोड़ता है" क्योंकि यह एक नया निर्माण करने के लिए विभिन्न मौजूदा कार्यक्षमताओं को जोड़ता है।

निम्नलिखित उदाहरण लें:

आपके पास लॉगिंग सिस्टम है। उस लॉगिंग सिस्टम से आप या तो फ़ाइल में सॉकेट या डेटाबेस में लॉग इन कर सकते हैं।

मुखौटा डिजाइन पैटर्न का उपयोग करके आप एक ही "इंटरफेस" के पीछे मौजूदा कार्यक्षमता से सभी रिश्तों को "छुपाएं" जो मुखौटा खुलासा करता है।

क्लाइंट कोड:

Logger logger = new Logger(); 
logger.initLogger("someLogger"); 
logger.debug("message"); 

कार्यान्वयन में कई वस्तुओं की बातचीत शामिल हो सकता है। लेकिन अंत में, कार्यक्षमता पहले से मौजूद है।

कार्यान्वयन::

class Logger { 

     private LoggerImpl internalLogger; 
     private LoggerManager manager; 

     public void initLogger(String loggerName) { 
      this.internalLogger = manager.getLogger(loggerName); 
     } 

     public void debug(String message) { 
      this.internalLogger.debug(message); 
     }  
} 

कार्यक्षमता पहले से ही मौजूद शायद "डिबग" विधि इस प्रकार कार्यान्वित किया जाता है। मुखौटा केवल इसे छुपाता है। इस hypothetical मामले में, LoggerManager सही लॉगर के निर्माण को संभालता है, और LoggerImpl एक पैकेज निजी ऑब्जेक्ट है जिसमें "डीबग" विधि है। इस तरह फेकाडे कार्यक्षमता को जोड़ नहीं रहा है, वह सिर्फ कुछ मौजूदा वस्तुओं को प्रस्तुत कर रहा है।

दूसरी तरफ मध्यस्थ विभिन्न वस्तुओं को जोड़कर नई कार्यक्षमता जोड़ता है।

एक ही Client कोड:

Logger logger = new Logger(); 
logger.initLogger("someLogger"); 
logger.debug("message"); 

कार्यान्वयन:

class Logger { 

     private java.io.PrintStream out; 
     private java.net.Socket client; 
     private java.sql.Connection dbConnection; 
     private String loggerName; 


     public void initLogger(String loggerName) { 
       this.loggerName = loggerName; 
       if (loggerName == "someLogger") { 
        out = new PrintStream(new File("app.log")); 
       } else if (loggerName == "serverLog") { 
        client = new Socket("127.0.0.1", 1234); 
       } else if(loggerName == "dblog") { 
        dbConnection = Class.forName()... . 
       } 

     } 

     public void debug(String message) { 

       if (loggerName == "someLogger") { 
        out.println(message); 
       } else if (loggerName == "serverLog") { 
        ObjectOutputStrewam oos = 
          new ObjectOutputStrewam(client.getOutputStream()); 
        oos.writeObject(message); 
       } else if(loggerName == "dblog") { 
        Pstmt pstmt = dbConnection.prepareStatment(LOG_SQL); 
        pstmt.setParameter(1, message); 
        pstmt.executeUpdate(); 
        dbConnection.commit(); 
       } 
     } 
} 

इस कोड में, मध्यस्थ एक है कि करने के लिए उपयुक्त "चैनल" बनाने के लिए व्यापार तर्क होता है लॉग इन करें और उस चैनल में लॉग इन करने के लिए भी। वह कार्यक्षमता बना रहा है।

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

अंत में, मुखौटा एक संरचनात्मक पैटर्न है, कि यह वस्तुओं की संरचना का वर्णन करता है, जबकि मध्यस्थ एक व्यवहार है, वह है, जिस तरह से वस्तुओं बातचीत का वर्णन है।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

ग्रेट स्पष्टीकरण .. मेरे पास इससे संबंधित एक प्रश्न है। जिस तरह से ReentrantLock और AbstractQueueSynchronizer (AQS) रचित हैं, क्या यह फेकाडे पैटर्न के उदाहरण में फिट बैठता है? मेरा मतलब है कि ReentrantLock केवल एक्यूएस की कार्यक्षमता का खुलासा करता है जो उपप्रणाली के रूप में मौजूद है। – AKS

+0

क्या @RayTayek उत्तर आपके उत्तर के विरूद्ध है? आपका मध्यस्थ प्रोटोकॉल यूनिडायरेक्शनल है, है ना? – Narek

+0

मुझे कोई साइट नहीं मिली (विकिपीडिया समेत) यह बताते हुए कि मध्यस्थ नई कार्यक्षमता जोड़ता है। क्या आप कुछ संदर्भ बता सकते हैं? – developer

12

मैं लॉग फ़ाइल कार्यक्षमता जोड़ने के लिए मध्यस्थ का उपयोग कर रहा हूं।

यह इस तरह काम करता है:

  • Obj एक मध्यस्थ यह कुछ किया की जरूरत बताता है।
  • मध्यस्थ विभिन्न क्लाइंट ऑब्जेक्ट्स को संदेश भेजता है।
  • ओबीजे बी बात करता है ओबीजे की जरूरत है, और मध्यस्थ के माध्यम से एक उचित संदेश वापस भेजता है।
  • इस बीच, ओब्जे सी मध्यस्थ द्वारा दोनों संदेश भी भेजता है, और परिणामों को लॉग करता है। इस तरह, हम लॉग फ़ाइलों से उपयोगकर्ता आंकड़े प्राप्त कर सकते हैं।
  • ओबीजे डी एक त्रुटि परीक्षक भी हो सकता है, ताकि अगर ओबीजे बी जवाब दे कि ओबीजे ए का अनुरोध असंभव है, तो ओबीजे डी ऐसी चीज हो सकती है जो उपयोगकर्ता को रिपोर्ट करे। नियमित गतिविधि की तुलना में त्रुटियों को अब एक अलग फ़ाइल में लॉग किया जा सकता है, और व्यवहार करने के लिए कुछ अन्य साधनों का उपयोग कर सकते हैं (बीपिंग, जो भी हो) कि ओब्जे ए को वास्तव में खुद से चिंता नहीं करनी चाहिए।
3

मैंने सोचा कि भेद दिशात्मक था: मुखौटा ग्राहक और मुखौटा के बीच एक तरफा संचार है; मध्यस्थ एक दो-तरफा वार्तालाप हो सकता है, जिसमें क्लाइंट और मध्यस्थ के बीच आगे और आगे बहने वाले संदेश होते हैं।

+0

क्षमा करें लेकिन यह अंतर वास्तव में गलत है, mmr का जवाब सही है। यद्यपि मैं भी आपके जैसा ही मानता हूं जब मैंने पहली बार उन्हें देखा –

2

"डिजाइन पैटर्न" पुस्तक से, मध्यस्थ पैटर्न की कुंजी निम्नानुसार वर्णित है: "यह (मध्यस्थ) विगेट्स (यानी 'परस्पर निर्भर वस्तुओं का समूह') के संचार के केंद्र के रूप में कार्य करता है। "

दूसरे शब्दों में, मध्यस्थ वस्तु एकमात्र सुपरबोजेक्ट है जो वस्तुओं की सहयोग करने के समूह में सभी अन्य वस्तुओं को जानता है और उन्हें एक दूसरे के साथ कैसे बातचीत करनी चाहिए। अन्य सभी वस्तुओं को एक दूसरे के बजाय मध्यस्थ वस्तु के साथ बातचीत करनी चाहिए।

इसके विपरीत, उपप्रणाली के उपभोक्ताओं द्वारा उपयोग के लिए उपप्रणाली में इंटरफेस के एक सेट के लिए एक मुखौटा एक "एकीकृत इंटरफेस" है - उपप्रणाली के घटकों में से नहीं।

फसाड:

6

एक साधारण सादृश्य ले लो

{ 
    car1.StartEngin();  
    attendant.charge(); 
    car1.driverOut(); 
} 

मध्यस्थ: यातायात प्रकाश की तरह एक पार्किंग स्थल, जब कॉल

parkingLot.Out(car1); 

एक सरल श्रृंखला काम करता हो एमएबी की तरह।

प्रकाश और कार के बीच संपर्क कर रहे हैं,

और कारों यह द्वारा नियंत्रित कर रहे राज्य है।

मैं

हालांकि शायद इस मध्यस्थ


और परिभाषा के बारे में "कार्यक्षमता जोड़ता" है:

फसाड के प्रकार: स्ट्रक्चरल

मध्यस्थ के प्रकार: व्यवहार

मुखौटा घटकों बारे में अधिक चिंतित निहित एकीकृत इंटरफेस में,

और मध्यस्थ चिंता कैसे वस्तुओं का एक सेट बातचीत थे।

9

संबंधित पैटर्न के तहत, gof कहता है: फेकाडे (185) मध्यस्थ से अलग है जिसमें यह अधिक सुविधाजनक इंटरफ़ेस प्रदान करने के लिए ऑब्जेक्ट्स का एक उपप्रणाली है। इसका प्रोटोकॉल यूनिडायरेक्शनल है; यानी, फेकाडे ऑब्जेक्ट उपप्रणाली वर्गों के अनुरोध करते हैं लेकिन इसके विपरीत नहीं। इसके विपरीत, मध्यस्थ सहकारी व्यवहार को सक्षम बनाता है कि सहकर्मी वस्तुएं प्रदान नहीं करती हैं या नहीं दे सकती हैं, और प्रोटोकॉल बहुआयामी है।

0

आप इस एसई प्रश्न में फसाड पैटर्न के बारे में जानकारी प्राप्त कर सकते:

What is Facade Design Pattern?

Facade जटिल प्रणाली के लिए एक सरल और एकीकृत इंटरफेस प्रदान करता है।

रियल दुनिया उदाहरण (Cleartrip उड़ान + होटल बुकिंग) इस पोस्ट में उपलब्ध है:

What is Facade Design Pattern?

Mediator पैटर्न: एक वस्तु समाहित कि कैसे वस्तुओं का एक सेट बातचीत को परिभाषित करें। मध्यस्थ एक दूसरे को स्पष्ट रूप से संदर्भित करने से वस्तुओं को रखकर ढीले युग्मन को बढ़ावा देता है, और यह आपको स्वतंत्र रूप से उनकी बातचीत को अलग करने देता है।

मेष नेटवर्क टोपोलॉजी का एक वास्तविक दुनिया उदाहरण एसई प्रश्न के ठीक नीचे में प्रदान की गई है:

  1. फसाड के लिए एक ही इंटरफेस प्रदान करता है:

    Mediator Vs Observer Object-Oriented Design Patterns

    मध्यस्थ पर आपकी क्वेरी के बारे में जिम्मेदारी कहते हैं मौजूदा उप-सिस्टम। मौजूदा उप-प्रणालियों को फेकाडे कक्षा के बारे में पता नहीं है।

  2. मध्यस्थ सहयोगी वस्तुओं के बारे में जानता है। यह विभिन्न सहयोगियों के बीच संचार सक्षम बनाता है। उदाहरण में मैंने लिंक किए गए प्रश्न में उद्धृत किया है, कंक्रीटमेडिएटर (नेटवर्कमेडिएटर) पंजीकरण की अधिसूचनाएं भेजता है और अन्य सहयोगियों को एक सहयोगी की घटना को अनधिकृत करता है।

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