अद्यतन: एक और प्रश्न जोड़ा गया (प्रश्न # 4)।रणनीति पैटर्न का उपयोग कर जावा में ईमेलर
हाय सब,
मैं अपने आप को एक कस्टम उपयोगिता ईमेल का निर्माण कर रहा हूँ। अब, एकल उत्तरदायित्व सिद्धांत का पालन करने के लिए, मैं निम्नलिखित कक्षाएं प्राप्त करना चाहता हूं: मेलरसेन्डर, मेलप्रोवाइडर और ईमेल ऑब्जेक्ट। MailSender एक प्रतिनिधि के अधिक है, यह नीचे की जाँच:
public class MailSender {
private IMailProvider mailProvider;
public void setMailProvider (IMailProvider provider) {
this.mailProvider = provider;
}
// option to set it up during construction
public MailSender (IMailProvider provider) {
this.mailProvider = provider;
}
public void sendEmail(EmailObject obj) {
if(mailProvider == null)
throw new RuntimeException("Need a mail provider to send email.");
try {
mailProvider.send(obj);
} catch (Exception e) {
// do something here
}
}
}
MailSender एक IMailProvider ईमेल प्रदाता है कि ईमेल भेजने का काम करता है की आवश्यकता है। यह नीचे खोजें:
public interface IMailProvider {
public void sendEmail(EmailObject obj);
}
public class SMTPEmailProvider implements IMailProvider {
public void sendEmail(EmailObject obj) {
// use SMTP to send email using passed-in config
}
}
public class JMSEmailProvider implements IMailProvider {
public void sendEmail(EmailObject obj) {
// push emails to JMS queue to be picked up by another thread
}
}
मैं कुछ रणनीतियों कि ऊपर बताया गया है, लेकिन यह किसी भी संख्या के लिए बढ़ाया जा सकता है। चूंकि मेलसेन्डर किसी भी समय अपने प्रदाता को बदल सकता है, यह प्रभावी रूप से रणनीति पैटर्न को लागू करता है?
MailSender sender = new MailSender(new SMTPMailProvider());
sender.send(new EmailObject());
sender.setMailProvider(new JMSMailProvider());
sender.send(new EmailObject());
मेरे सवाल कर रहे हैं:
1. मैं रणनीति पैटर्न को लागू किया है
public class EmailObject {
private String to;
private String from;
private String cc;
private String subject;
private String body;
// setters and getters for all
}
क्लाइंट कोड तो तरह दिखेगा:
EmailObject प्रासंगिक ईमेल जानकारी युक्त एक POJO है ?
2. क्या यह डिज़ाइन अच्छा है? क्या मेलप्रोवाइडर को किसी ईमेल ऑब्जेक्ट से अवगत होना समझ में आता है?
3. क्या होगा यदि मेरे पास एक नया ईमेल ऑब्जेक्ट था जिसके बाद उसे अनुलग्नक की आवश्यकता थी?
4. क्लाइंट कोड को अब MailSender बनाने से पहले एक विशिष्ट MailProvider प्राप्त करने की आवश्यकता है ... क्या यह समझ में आता है?
इस कथन के लिए +1: "किसी भी तरह से, डिज़ाइन पैटर्न आपको सोचने में मदद करने के लिए हैं, आपको किसी विशिष्ट नाम पर लॉक न करने के लिए।" मुझे यह जानने में थोड़ी देर लग गई कि: ^) – bedwyr
मैं ऐसा करने का एक अच्छा तरीका जानने की कोशिश कर रहा हूं। मेलरसेन्डर को कंक्रीट क्लास के बजाय एक ईमेल ऑब्जेक्ट इंटरफ़ेस मिलता है, प्रदाता जानकारी को "कैसे प्राप्त करता है"? इंटरफ़ेस कंक्रीट कक्षा में जानकारी के लिए एक अनुबंध प्रदान करेगा, लेकिन जब मैं _added_ जानकारी के साथ एक नई वस्तु बनाउंगा तो क्या होगा? एक मूल ईमेल (से, सीसी, विषय, शरीर) के मामले में एक अनुलग्नक (बाइट [] डेटा) के साथ एक ईमेल बनाम? – djunforgetable
आपको यह निर्धारित करना होगा कि प्रत्येक प्रदाता किस परिसर से परिचित है और इंटरफ़ेस में गेटर्स की पेशकश करता है। प्रदाताओं को आम तौर पर केवल ईमेल से निपटने की उम्मीद की जा सकती है, इसलिए आपको जिस ईमेल की आवश्यकता होगी उसे ईमेल में डाल देना होगा। – Uri