อเล็กซ์ส่วนใหญ่คุณต้องการการสืบทอดหลายครั้งเป็นสัญญาณว่าโครงสร้างวัตถุของคุณค่อนข้างไม่ถูกต้อง ในสถานการณ์ที่คุณระบุไว้ฉันเห็นว่าคุณมีความรับผิดชอบในชั้นเรียนกว้างเกินไป หากข้อความเป็นส่วนหนึ่งของรูปแบบธุรกิจแอปพลิเคชันไม่ควรดูแลเกี่ยวกับการแสดงผลเอาต์พุต แต่คุณสามารถแยกความรับผิดชอบและใช้ 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();
$textIM = new InvitationTextMessage();
$d = new MessageDispatcher();
$d->dispatch($htmlIM);
$d->dispatch($textIM);
โปรดทราบว่า MessageDispatcher จะทำการตัดสินใจว่าจะส่งเป็น HTML หรือข้อความธรรมดาขึ้นอยู่กับtype
คุณสมบัติในวัตถุข้อความที่ส่งผ่าน
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 และอัลกอริทึมการส่งจะถูกมอบหมายให้กับผู้มอบหมายงาน รูปแบบกลยุทธ์นี้เรียกว่าคุณสามารถอ่านเพิ่มเติมเกี่ยวกับมันนี่