PHP設計模式學習筆記: 責任鏈模式(Chain of Responsibility)
// 抽象書本類 abstract class AbstractBookTopic { abstract function getTopic(); abstract function getTitle(); abstract function setTitle($title_in); }// 書本類,繼承自抽象書本類 class BookTopic extends AbstractBookTopic { private $topic; private $title;
function __construct($topic_in) { $this->topic = $topic_in; $this->title = NULL; } function getTopic() { return $this->topic; } function getTitle() { if (NULL != $this->title) { return $this->title; } else { return '目前沒有標題'; } } function setTitle($title_in) { $this->title = $title_in; }
}
// 子書本類,繼承自抽象書本類 class BookSubTopic extends AbstractBookTopic { private $topic; private $parentTopic; private $title;
function __construct($topic_in, BookTopic $parentTopic_in) { $this->topic = $topic_in; $this->parentTopic = $parentTopic_in; $this->title = NULL; } function getTopic() { return $this->topic; } function getParentTopic() { return $this->parentTopic; } function getTitle() { if (NULL != $this->title) { return $this->title; } else { return $this->parentTopic->getTitle(); } } function setTitle($title_in) { $this->title = $title_in; }
}
// 子子書本類,繼承自抽象書本類 class BookSubSubTopic extends AbstractBookTopic { private $topic; private $parentTopic; private $title;
function __construct($topic_in, BookSubTopic $parentTopic_in) { $this->topic = $topic_in; $this->parentTopic = $parentTopic_in; $this->title = NULL; } function getTopic() { return $this->topic; } function getParentTopic() { return $this->parentTopic; } function getTitle() { if (NULL != $this->title) { return $this->title; } else { return $this->parentTopic->getTitle(); } } function setTitle($title_in) { $this->title = $title_in; }
}
writeln("開始測試責任鏈模式"); writeln("");
$bookTopic = new BookTopic("魔法"); writeln("bookTopic設置標題前:"); writeln("主題: " . $bookTopic->getTopic()); writeln("標題: " . $bookTopic->getTitle()); writeln("");
$bookTopic->setTitle("哈利波特與魔法石"); writeln("bookTopic設置標題后: "); writeln("主題: " . $bookTopic->getTopic()); writeln("標題: " . $bookTopic->getTitle()); writeln("");
$bookSubTopic = new BookSubTopic("英國魔法", $bookTopic); writeln("bookSubTopic標題設置前: "); writeln("主題: " . $bookSubTopic->getTopic()); writeln("標題: " . $bookSubTopic->getTitle()); writeln("");
$bookSubTopic->setTitle("哈利波特與混血王子"); writeln("bookSubTopic標題設置后: "); writeln("主題: ". $bookSubTopic->getTopic()); writeln("標題: ". $bookSubTopic->getTitle()); writeln("");
$bookSubSubTopic = new BookSubSubTopic("英國現代魔法", $bookSubTopic); writeln("bookSubSubTopic標題設置前: "); writeln("主題: " . $bookSubSubTopic->getTopic()); writeln("標題: " . $bookSubSubTopic->getTitle()); writeln("");
$bookSubTopic->setTitle(NULL); writeln("bookSubSubTopic、 bookSubTopic都沒有設置標題:"); writeln("主題: " . $bookSubSubTopic->getTopic()); writeln("標題: " . $bookSubSubTopic->getTitle()); writeln("");
writeln("結束測試責任鏈模式");
function writeln($line_in) { echo $line_in.PHP_EOL; }</pre>結果:
開始測試責任鏈模式bookTopic設置標題前: 主題: 魔法 標題: 目前沒有標題
bookTopic設置標題后: 主題: 魔法 標題: 哈利波特與魔法石
bookSubTopic標題設置前: 主題: 英國魔法 標題: 哈利波特與魔法石
bookSubTopic標題設置后: 主題: 英國魔法 標題: 哈利波特與混血王子
bookSubSubTopic標題設置前: 主題: 英國現代魔法 標題: 哈利波特與混血王子
bookSubSubTopic、 bookSubTopic都沒有設置標題: 主題: 英國現代魔法 標題: 哈利波特與魔法石
結束測試責任鏈模式</pre>原文地址:http://sourcemaking.com/design_patterns/chain_of_responsibility/php