फ़ाकडे बनाम मध्यस्थ


83

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

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

मैं समझता हूं कि उप प्रणाली के घटकों को मोहरा के बारे में पता नहीं है, जहां घटक स्पष्ट रूप से मध्यस्थ के बारे में जानते हैं।

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

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

जवाबों:


103

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

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

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

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

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

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

क्लाइंट कोड:

 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 );
      }     
 }

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

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

एक ही ग्राहक कोड:

 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();
               }
      }
 }

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

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

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

आशा है कि ये आपकी मदद करेगा।


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

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

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


13

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

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

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

12

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


8

एक सरल सादृश्य लें:

मुखौटा: पार्किंग स्थल की तरह, जब कॉल करें

parkingLot.Out(car1);

माब एक सरल श्रृंखला काम करता है:

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

मध्यस्थ: ट्रैफिक लाइट की तरह।

प्रकाश और कार के बीच बातचीत होती है,

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

हालांकि मैं शायद यह मध्यस्थ "कार्यक्षमता जोड़ता है"


और परिभाषा के बारे में:

मुखौटा का प्रकार: संरचनात्मक

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

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

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


4

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


क्षमा करें, लेकिन यह अंतर वास्तव में गलत है, एमएमआर का उत्तर सही है। हालाँकि मुझे भी आप पर वैसा ही विश्वास था, जब मैंने पहली बार उन्हें देखा था
रॉबर्ट गोल्ड

3

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

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

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


1

आप इस एसई प्रश्न में मुखौटा पैटर्न के बारे में विवरण पा सकते हैं:

मुखौटा डिजाइन पैटर्न क्या है?

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

वास्तविक विश्व उदाहरण ( क्लियरट्रिप फ्लाइट + होटल बुकिंग ) इस पोस्ट में उपलब्ध है:

मुखौटा डिजाइन पैटर्न क्या है?

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

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

मध्यस्थ बनाम ऑब्जर्वर ऑब्जेक्ट-ओरिएंटेड डिज़ाइन पैटर्न

मध्यस्थ पर अपनी क्वेरी के बारे में जिम्मेदारी जोड़ता है:

  1. मुखौटा केवल मौजूदा उप-प्रणालियों को इंटरफ़ेस प्रदान करता है । मौजूदा उप-प्रणालियों को मुखौटा श्रेणी के बारे में जानकारी नहीं है।

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


1

दोनों वस्तुओं के दूसरे समूह पर किसी प्रकार की नीति लागू करते हैं। मुखौटा नीति ऊपर से लागू करता है, और मध्यस्थ नीचे से नीति लागू करता है। के उपयोग फसाड दिखाई और बाधा है, जबकि के उपयोग मध्यस्थ का अदृश्य और सक्षम है।

फसाड जब आप एक जटिल और सामान्य इंटरफ़ेस है कि वस्तुओं का एक समूह के लिए एक सरल और विशिष्ट इंटरफेस प्रदान करना चाहते हैं पैटर्न का इस्तेमाल किया है।

मध्यस्थ पैटर्न भी नीति लगाता है। हालाँकि, जबकि फेकडे ने अपनी नीति को एक दृश्य और विवश तरीके से लागू किया , लेकिन मध्यस्थ अपनी नीतियों को एक छिपे और अनर्गल तरीके से लागू करता है।

एजाइल सॉफ्टवेयर डेवलपमेंट, सिद्धांत, पैटर्न और प्रैक्टिस रॉबर्ट सी। मार्टिन।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.