... सबसे साइटों का कहना है कि मध्यस्थ "कार्यक्षमता जोड़ता" ...
मुखौटा केवल एक अलग नजरिए से मौजूदा कार्यक्षमता को उजागर करता है।
मध्यस्थ कार्यक्षमता "जोड़ता है" क्योंकि यह एक नया निर्माण करने के लिए विभिन्न मौजूदा कार्यक्षमताओं को जोड़ता है।
निम्नलिखित उदाहरण लें:
आपके पास लॉगिंग सिस्टम है। उस लॉगिंग सिस्टम से आप या तो फ़ाइल में सॉकेट या डेटाबेस में लॉग इन कर सकते हैं।
मुखौटा डिजाइन पैटर्न का उपयोग करके आप एक ही "इंटरफेस" के पीछे मौजूदा कार्यक्षमता से सभी रिश्तों को "छुपाएं" जो मुखौटा खुलासा करता है।
क्लाइंट कोड:
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();
}
}
}
इस कोड में, मध्यस्थ एक है कि करने के लिए उपयुक्त "चैनल" बनाने के लिए व्यापार तर्क होता है लॉग इन करें और उस चैनल में लॉग इन करने के लिए भी। वह कार्यक्षमता बना रहा है।
बेशक, पॉलिमॉर्फिज्म का उपयोग करके इसे कार्यान्वित करने के बेहतर तरीके हैं, लेकिन यहां बिंदु यह दिखाने के लिए है कि कैसे मध्यस्थ मौजूदा कार्यक्षमता को जोड़कर नई कार्यक्षमता "जोड़ता है" (मेरे नमूने में बहुत खेद नहीं दिखाया गया) लेकिन कल्पना करें मध्यस्थ, रिमोट होस्ट डेटाबेस को लॉग ऑन करने के लिए डेटाबेस से पढ़ें, फिर क्लाइंट बनाता है और अंत में उस क्लाइंट प्रिंट स्ट्रीम को लॉग संदेश लिखता है। इस तरह मध्यस्थ विभिन्न वस्तुओं के बीच "मध्यस्थ" होगा।
अंत में, मुखौटा एक संरचनात्मक पैटर्न है, कि यह वस्तुओं की संरचना का वर्णन करता है, जबकि मध्यस्थ एक व्यवहार है, वह है, जिस तरह से वस्तुओं बातचीत का वर्णन है।
मुझे उम्मीद है कि इससे मदद मिलती है।
ग्रेट स्पष्टीकरण .. मेरे पास इससे संबंधित एक प्रश्न है। जिस तरह से ReentrantLock और AbstractQueueSynchronizer (AQS) रचित हैं, क्या यह फेकाडे पैटर्न के उदाहरण में फिट बैठता है? मेरा मतलब है कि ReentrantLock केवल एक्यूएस की कार्यक्षमता का खुलासा करता है जो उपप्रणाली के रूप में मौजूद है। – AKS
क्या @RayTayek उत्तर आपके उत्तर के विरूद्ध है? आपका मध्यस्थ प्रोटोकॉल यूनिडायरेक्शनल है, है ना? – Narek
मुझे कोई साइट नहीं मिली (विकिपीडिया समेत) यह बताते हुए कि मध्यस्थ नई कार्यक्षमता जोड़ता है। क्या आप कुछ संदर्भ बता सकते हैं? – developer