Design patterns
Цепочка ответственности
Поиск…
Пример последовательности цепочек ответственности (Php)
Метод, вызываемый в одном объекте, будет перемещаться по цепочке объектов до тех пор, пока не будет найден один, который может правильно обрабатывать вызов. В этом конкретном примере используются научные эксперименты с функциями, которые могут просто получить название эксперимента, экспериментальный идентификатор или ткань, использованные в эксперименте.
abstract class AbstractExperiment {
abstract function getExperiment();
abstract function getTitle();
}
class Experiment extends AbstractExperiment {
private $experiment;
private $tissue;
function __construct($experiment_in) {
$this->experiment = $experiment_in;
$this->tissue = NULL;
}
function getExperiment() {
return $this->experiment;
}
//this is the end of the chain - returns title or says there is none
function getTissue() {
if (NULL != $this->tissue) {
return $this->tissue;
} else {
return 'there is no tissue applied';
}
}
}
class SubExperiment extends AbstractExperiment {
private $experiment;
private $parentExperiment;
private $tissue;
function __construct($experiment_in, Experiment $parentExperiment_in) {
$this->experiment = $experiment_in;
$this->parentExperiment = $parentExperiment_in;
$this->tissue = NULL;
}
function getExperiment() {
return $this->experiment;
}
function getParentExperiment() {
return $this->parentExperiment;
}
function getTissue() {
if (NULL != $this->tissue) {
return $this->tissue;
} else {
return $this->parentExperiment->getTissue();
}
}
}
//This class and all further sub classes work in the same way as SubExperiment above
class SubSubExperiment extends AbstractExperiment {
private $experiment;
private $parentExperiment;
private $tissue;
function __construct($experiment_in, Experiment $parentExperiment_in) { //as above }
function getExperiment() { //same as above }
function getParentExperiment() { //same as above }
function getTissue() { //same as above }
}
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow