Alex,大多数时候你需要多重继承是一个信号,你的对象结构有点不正确。在你概述的情况下,我看到你有阶级责任太宽泛了。如果 Message 是应用程序业务模型的一部分,则它不应关注呈现输出。相反,您可以拆分责任并使用 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 类中完成,发送算法委托给调度程序。这被称为策略模式,你可以在这里阅读更多关于它的信息。