PHP Design Patterns Chain of Responsibility
About the Chain of Responsibility
A method called in one object will move up a chain of objects until one is found that can properly handle the call.
AbstractBookTopic.php
//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
abstract class AbstractBookTopic {
abstract function getTopic();
abstract function getTitle();
abstract function setTitle($title_in);
}
download source, use right-click and "Save Target As..." to save with a .php extension.
BookTopic.php
//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
class BookTopic extends AbstractBookTopic {
private $topic;
private $title;
function __construct($topic_in) {
$this->topic = $topic_in;
$this->title = NULL;
}
function getTopic() {return $this->topic;}
//this is the end of the chain - returns title or says there is none
function getTitle() {
if (NULL != $this->title) {
return $this->title;
} else {
return 'there is no title avaialble';
}
}
function setTitle($title_in) {$this->title = $title_in;}
}
download source, use right-click and "Save Target As..." to save with a .php extension.
BookSubTopic.php
//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
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;}
}
download source, use right-click and "Save Target As..." to save with a .php extension.
BookSubSubTopic.php
//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
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;}
}
download source, use right-click and "Save Target As..." to save with a .php extension.
Try the Design Patterns Video Tutorial from SourceMaking
testChainOfResponsibility.php
//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
include_once('AbstractBookTopic.php'); include_once('BookTopic.php'); include_once('BookSubTopic.php'); include_once('BookSubSubTopic.php');
writeln("BEGIN TESTING CHAIN OF RESPONSIBILITY PATTERN"); writeln("");
$bookTopic = new BookTopic("PHP 5"); writeln("bookTopic before title is set:"); writeln("topic: " . $bookTopic->getTopic()); writeln("title: " . $bookTopic->getTitle()); writeln(""); $bookTopic->setTitle( "PHP 5 Recipes by Babin, Good, Kroman, and Stephens"); writeln("bookTopic after title is set: "); writeln("topic: " . $bookTopic->getTopic()); writeln("title: " . $bookTopic->getTitle()); writeln(""); $bookSubTopic = new BookSubTopic("PHP 5 Patterns",$bookTopic); writeln("bookSubTopic before title is set: "); writeln("topic: " . $bookSubTopic->getTopic()); writeln("title: " . $bookSubTopic->getTitle()); writeln(""); $bookSubTopic->setTitle( "PHP 5 Objects Patterns and Practice by Zandstra"); writeln("bookSubTopic after title is set: "); writeln("topic: ". $bookSubTopic->getTopic()); writeln("title: ". $bookSubTopic->getTitle()); writeln(""); $bookSubSubTopic = new BookSubSubTopic("PHP 5 Patterns for Cats", $bookSubTopic); writeln("bookSubSubTopic with no title set: "); writeln("topic: " . $bookSubSubTopic->getTopic()); writeln("title: " . $bookSubSubTopic->getTitle()); writeln(""); $bookSubTopic->setTitle(NULL); writeln( "bookSubSubTopic with no title for set for bookSubTopic either:"); writeln("topic: " . $bookSubSubTopic->getTopic()); writeln("title: " . $bookSubSubTopic->getTitle()); writeln("");
writeln("END TESTING CHAIN OF RESPONSIBILITY PATTERN");
function writeln($line_in) { echo $line_in."<"."BR".">"; }
download source, use right-click and "Save Target As..." to save with a .php extension.
output of testDecorator.php
BEGIN TESTING CHAIN OF RESPONSIBILITY PATTERN
bookTopic before title is set: topic: PHP 5 title: there is no title avaialble
bookTopic after title is set: topic: PHP 5 title: PHP 5 Recipes by Babin, Good, Kroman, and Stephens
bookSubTopic before title is set: topic: PHP 5 Patterns title: PHP 5 Recipes by Babin, Good, Kroman, and Stephens
bookSubTopic after title is set: topic: PHP 5 Patterns title: PHP 5 Objects Patterns and Practice by Zandstra
bookSubSubTopic with no title set: topic: PHP 5 Patterns for Cats title: PHP 5 Objects Patterns and Practice by Zandstra
bookSubSubTopic with no title for set for bookSubTopic either: topic: PHP 5 Patterns for Cats title: PHP 5 Recipes by Babin, Good, Kroman, and Stephens
END TESTING CHAIN OF RESPONSIBILITY PATTERN
References
| Comments |
| Sign In |
| to add the first comment for PHP Design Patterns Chain of Responsibility. |