एलेक्स, कई बार आपको कई विरासतों की आवश्यकता होती है एक संकेत है कि आपकी वस्तु संरचना कुछ गलत है। जिस स्थिति में आपने उल्लिखित किया है, मुझे लगता है कि आपके पास वर्ग जिम्मेदारी बहुत व्यापक है। यदि संदेश अनुप्रयोग व्यवसाय मॉडल का हिस्सा है, तो उसे आउटपुट देने के बारे में ध्यान नहीं रखना चाहिए। इसके बजाय, आप जिम्मेदारी को विभाजित कर सकते हैं और MessageDispatcher का उपयोग कर सकते हैं जो पाठ या HTML बैकएंड का उपयोग करके पारित संदेश भेजता है। मुझे आपका कोड नहीं पता, लेकिन मुझे इसे इस तरह अनुकरण करना चाहिए:
$m = new Message();
$m->type = 'text/html';
$m->from = 'John Doe <jdoe@yahoo.com>';
$m->to = 'Random Hacker <rh@gmail.com>';
$m->subject = 'Invitation email';
$m->importBody('invitation.html');
$d = new MessageDispatcher();
$d->dispatch($m);
इस तरह आप संदेश वर्ग में कुछ विशेषज्ञता जोड़ सकते हैं:
$htmlIM = new InvitationHTMLMessage(); // html type, subject and body configuration in constructor
$textIM = new InvitationTextMessage(); // text type, subject and body configuration in constructor
$d = new MessageDispatcher();
$d->dispatch($htmlIM);
$d->dispatch($textIM);
ध्यान दें कि MessageDispatcher एक निर्णय लेगा कि संदेश के रूप में HTML या सादे पाठ के रूप में भेजा जाना है या नहीं type
।
// in MessageDispatcher class
public function dispatch(Message $m) {
if ($m->type == 'text/plain') {
$this->sendAsText($m);
} elseif ($m->type == 'text/html') {
$this->sendAsHTML($m);
} else {
throw new Exception("MIME type {$m->type} not supported");
}
}
इसे योग करने के लिए, जिम्मेदारी दो वर्गों के बीच विभाजित है। संदेश कॉन्फ़िगरेशन InvitationHTMLMessage / InvitationTextMessage वर्ग में किया जाता है, और एल्गोरिथ्म भेजने को डिस्पैचर में भेजा जाता है। इसे स्ट्रैटेजी पैटर्न कहा जाता है, आप यहां इस पर अधिक पढ़ सकते हैं ।