Alex, çoğu zaman çoklu kalıtıma ihtiyaç duyarsan, nesne yapının bir şekilde yanlış olduğunun bir işaretidir. Anlattığınız durumda, sınıf sorumluluğunuzun çok geniş olduğunu görüyorum. Mesaj, uygulama iş modelinin bir parçasıysa, çıktı oluşturmaya özen göstermemelidir. Bunun yerine sorumluluğu bölebilir ve metin veya html arka uç kullanarak iletilen İletiyi gönderen MessageDispatcher'ı kullanabilirsiniz. Kodunuzu bilmiyorum, ancak şu şekilde simüle etmeme izin verin:
$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);
Bu şekilde, Mesaj sınıfına bazı uzmanlıklar ekleyebilirsiniz:
$htmlIM = new InvitationHTMLMessage();
$textIM = new InvitationTextMessage();
$d = new MessageDispatcher();
$d->dispatch($htmlIM);
$d->dispatch($textIM);
MessageDispatcher'ın, type
iletilen Message nesnesindeki özelliğe bağlı olarak HTML veya düz metin olarak gönderilip gönderilmeyeceğine karar vereceğini unutmayın .
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");
}
}
Özetlemek gerekirse, sorumluluk iki sınıf arasında bölünmüştür. Mesaj yapılandırması InvitationHTMLMessage / InvitationTextMessage sınıfında yapılır ve gönderme algoritması dağıtıcıya delege edilir. Buna Strateji Modeli denir, buradan daha fazlasını okuyabilirsiniz .