Szukaj…


Przykład łańcucha odpowiedzialności (php)

Metoda wywoływana w jednym obiekcie przesunie się w górę łańcucha obiektów, dopóki nie zostanie znaleziony taki, który będzie w stanie poprawnie obsłużyć wywołanie. W tym konkretnym przykładzie wykorzystano eksperymenty naukowe z funkcjami, które mogą uzyskać tytuł eksperymentu, identyfikator eksperymentu lub tkankę użytą w eksperymencie.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow