मॉडल-दृश्य-प्रस्तोता

मॉडल-व्यू-प्रस्तोता (एमवीपी) मॉडल-व्यू-कंट्रोलर (एमवीसी) वास्तुशिल्प पैटर्न की व्युत्पत्ति है, और इसका उपयोग ज्यादातर यूजर इंटरफेस बनाने के लिए किया जाता है।

एमवीपी में, प्रस्तोता मध्य-पुरुष की कार्यक्षमता ग्रहण करता है। एमवीपी में, सभी प्रस्तुति तर्क प्रस्तुतकर्ता को भेज दिए जाते हैं।

इतिहास
मॉडल-व्यू-प्रस्तोता सॉफ़्टवेयर पैटर्न की शुरुआत 1990 के दशक की शुरुआत में ऐप्पल इंक, आईबीएम और हेवलेट पैकर्ड  के संयुक्त उद्यम प्रतिभावान में हुई थी। एमवीपी टैलिजेंट के सी++-आधारित कॉमनप्वाइंट वातावरण में अनुप्रयोग विकास के लिए अंतर्निहित प्रोग्रामिंग मॉडल है। पैटर्न को बाद में टैलिजेंट द्वारा जावा (प्रोग्रामिंग भाषा) में स्थानांतरित कर दिया गया और टैलिजेंट सीटीओ माइक पोटेल द्वारा एक पेपर में लोकप्रिय बनाया गया। 1998 में टैलिजेंट के बंद होने के बाद, डॉल्फिन स्मॉलटॉक के एंडी बोवर और ब्लेयर मैकग्लाशन ने अपने स्मॉलटॉक यूजर इंटरफेस फ्रेमवर्क के लिए आधार बनाने के लिए एमवीपी पैटर्न को अनुकूलित किया। 2006 में, माइक्रोसॉफ्ट ने .NET फ्रेमवर्क में यूजर इंटरफेस प्रोग्रामिंग के लिए अपने दस्तावेज़ीकरण और उदाहरणों में एमवीपी को शामिल करना शुरू किया। एमवीपी पैटर्न के विकास और कई वेरिएंट, जिसमें एमवीपी का एमवीसी जैसे अन्य डिजाइन पैटर्न से संबंध शामिल है, पर मार्टिन फाउलर (सॉफ्टवेयर इंजीनियर) के एक लेख में विस्तार से चर्चा की गई है। और दूसरा डेरेक ग्रीर द्वारा।

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

आम तौर पर, दृश्य कार्यान्वयन उदाहरण (कंप्यूटर विज्ञान) ठोस प्रस्तुतकर्ता वस्तु, स्वयं को एक संदर्भ प्रदान करता है। निम्नलिखित सी शार्प (प्रोग्रामिंग भाषा)|सी# कोड एक सरल व्यू कंस्ट्रक्टर प्रदर्शित करता है:

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

लेयरिंग के दृष्टिकोण से, प्रस्तुतकर्ता वर्ग को बहुस्तरीय वास्तुकला प्रणाली में एप्लिकेशन परत से संबंधित माना जा सकता है, लेकिन इसे एप्लिकेशन परत और उपयोगकर्ता इंटरफ़ेस परत के बीच स्वयं की प्रस्तुतकर्ता परत के रूप में भी देखा जा सकता है।

.NET
.NET फ्रेमवर्क|.NET वातावरण किसी भी अन्य विकास वातावरण की तरह एमवीपी पैटर्न का समर्थन करता है। एक ही मॉडल और प्रस्तुतकर्ता वर्ग का उपयोग कई इंटरफेस का समर्थन करने के लिए किया जा सकता है, जैसे कि ASP.NET वेब एप्लिकेशन, विंडोज़ फॉर्म एप्लिकेशन या सिल्वरलाइट एप्लिकेशन। प्रस्तुतकर्ता एक इंटरफ़ेस के माध्यम से दृश्य से जानकारी प्राप्त करता है और सेट करता है जिसे इंटरफ़ेस (दृश्य) घटक द्वारा एक्सेस किया जा सकता है।

पैटर्न को मैन्युअल रूप से लागू करने के अलावा, अधिक स्वचालित फैशन में एमवीपी पैटर्न का समर्थन करने के लिए एक मॉडल-व्यू-प्रस्तुतकर्ता ढांचे का उपयोग किया जा सकता है।

जावा
जावा (प्रोग्रामिंग भाषा) ( सार विंडो टूलकिट /स्विंग (जावा)/ मानक विजेट टूलकिट ) एप्लिकेशन में, एमवीपी पैटर्न का उपयोग यूजर इंटरफेस क्लास को व्यू इंटरफेस लागू करने की अनुमति देकर किया जा सकता है।

उसी दृष्टिकोण का उपयोग जावा वेब-आधारित अनुप्रयोगों के लिए किया जा सकता है, क्योंकि आधुनिक जावा घटक-आधारित वेब फ्रेमवर्क मोटे क्लाइंट के समान घटक दृष्टिकोण का उपयोग करके क्लाइंट-साइड लॉजिक के विकास की अनुमति देते हैं।

Google वेब टूलकिट में एमवीपी को लागू करने के लिए केवल यह आवश्यक है कि कुछ घटक व्यू इंटरफ़ेस को लागू करें। वाडिन या इको (फ्रेमवर्क) वेब फ्रेमवर्क का उपयोग करके भी यही दृष्टिकोण संभव है।

जावा फ्रेमवर्क में निम्नलिखित शामिल हैं:
 * जावाएफएक्स
 * प्रतिध्वनि (ढांचा)
 * गूगल वेब टूलकिट
 * जेफ़ेस
 * स्विंग (जावा)
 * वादिन
 * ZK (ढांचा)

पीएचपी
PHP के लचीले रनटाइम वातावरण के कारण, एप्लिकेशन लॉजिक के दृष्टिकोण की व्यापक संभावनाएं हैं। मॉडल परत का कार्यान्वयन अंतिम एप्लिकेशन प्रोग्रामर पर छोड़ दिया गया है।

PHP फ्रेमवर्क में निम्नलिखित शामिल हैं:
 * CodeIgniter
 * laravel
 * शुद्ध रूपरेखा

यह भी देखें

 * बहुस्तरीय वास्तुकला
 * मॉडल-व्यू-नियंत्रक
 * मॉडल-व्यू-व्यूमॉडल
 * प्रस्तुतकर्ता पहले (सॉफ्टवेयर दृष्टिकोण)

बाहरी संबंध

 * Model View Presenter Example from the GWT project.
 * Model-View-Presenter implementation thoughts at StackExchange