मेरी राय में बहुत पुराने लेख है, Impl साथ नामकरण देखकर याद नहीं है।
मुझे लगता है कि विकिपीडिया बेहतर विवरण नहीं है:
उपवर्गों व्यवहार है कि कोड में
से बचने के दोहराव से भिन्न हो सकते हैं (विधि अधिभावी के माध्यम से) को लागू करते हैं:
टेम्पलेट विधि करने के लिए प्रयोग किया जाता है: सामान्य वर्कफ़्लो संरचना को अमूर्त वर्ग के एल्गोरिदम में एक बार लागू किया जाता है, और प्रत्येक उप-वर्ग में आवश्यक विविधताएं लागू की जाती हैं।
किस बिंदु (ओं) उपclassing पर नियंत्रण की अनुमति है। एक साधारण पॉलीमोर्फिक ओवरराइड के विपरीत, जहां बेस विधि पूरी तरह से वर्कफ़्लो में कट्टरपंथी परिवर्तन की इजाजत दे दी जाएगी, केवल वर्कफ़्लो के विशिष्ट विवरण बदलने की अनुमति है।
नियंत्रण संरचना (नियंत्रण के उलट) एक टेम्पलेट पैटर्न के आवेदन का परिणाम है कि अक्सर हॉलीवुड सिद्धांत रूप में निर्दिष्ट है: "। हमें फोन, हम आपको फोन करता हूँ मत करो" इस सिद्धांत का उपयोग करते हुए, अभिभावक वर्ग में टेम्पलेट विधि आवश्यकतानुसार सबक्लास विधियों को कॉल करके समग्र प्रक्रिया को नियंत्रित करती है।
सरल शब्दों में, आप अपनी बेस कक्षा में कंकाल परिभाषित करते हैं, और व्युत्पन्न कक्षाएं कार्यान्वयन के बीच अंतर लागू करती हैं।
मान लें कि हमारे पास जानकारी है, जो विभिन्न चैनलों पर प्रकाशित होना चाहिए।
तो हम बेस क्लास प्रकाशक बनाते हैं, जिसमें कंकाल है कि यह कैसे करें।
हम प्रारंभिकरण को लागू करने के लिए मजबूर करते हैं, कि प्रत्येक व्युत्पन्न पता कहां प्रकाशित करेगा।
हम कार्यान्वयन भेजते हैं, जो अधिकांश चैनलों को फिट करता है और यदि कुछ चैनल http के बजाय ftp का उपयोग करते हैं, तो हम भेजने को ओवरराइड करने देते हैं।
और डबबेस को लॉगिंग करने के लिए लॉग इन करना सभी चैनलों के लिए समान है, इसलिए हम इसे ओवरराइड करने की अनुमति नहीं देते हैं।
केवल प्रकाशन प्रकाशक व्युत्पन्न वर्ग के उपयोगकर्ता के लिए पूर्णांक है, इसलिए केवल वह विधि सार्वजनिक है।
public abstract class Publisher
{
private address;
// if you wish to force implementation in derived class, make method abstract
private abstract void Initialize();
// if you wish optional implementation in derived class, make it virtual
protected virtual void SendChangesToWeb()
{
// ...
webClient.Upload(address, data)
}
// if you wish that some step could not be changed from outside
private void LogSentChangesToDatabase()
{
// ... save date time when was send and what was sent
}
// this sequence is the same for all derives, no point to duplicate
public void PublishUpdates()
{
Initialize();
SendChangesToWeb();
LogSentChangesToDatabase();
}
}
public class GooglePublisher : Publisher {
private override Initialize()
{
address = "http://www.google.com";
}
}
public class FtpPublisher : Publisher {
private override Initialize()
{
address = "ftp://test.com";
}
protected override SendChangesToWeb()
{
FtpClient.Upload(address, data)
}
}
धन्यवाद Giedrius, यह एक बहुत ही जानकारीपूर्ण उदाहरण है। मुझे लगता है कि मुझे वास्तव में इस अवधारणा का कुछ समझ है। लेकिन मुझे नहीं पता कि यह अधिक ड्रिल करने योग्य है या यदि कोई इस शैली का व्यावहारिक दुनिया में उपयोग कर रहा है। – Aakash
नामकरण शैली - नहीं, लेकिन पैटर्न का उपयोग किया जाता है, उपयोगी और काफी प्राकृतिक (प्राकृतिक - मेरा मतलब है कि मैं यह जानने के बिना इसका उपयोग कर रहा था कि यह एक प्रसिद्ध पैटर्न है :)। – Giedrius
:-) शायद मैंने यह नहीं देखा। हालांकि यह सरल और साफ है। आपकी सभी मदद का धन्यवाद। – Aakash