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