przykład

abstract class ParamHandler {
 protected $source;
 protected $params = array();

 function __construct($source) {
 $this->source = $source;
 }
 function addParam($key, $val) {
 $this->params[$key] = $val;
 }
 function getAllParams() {
 return $this->params;
 }
 static function getInstance($filename) {
 if ( preg_match("/\.xml$/i", $filename))
 return new XmlParamHandler($filename);
 }
 return new TextParamHandler($filename);
 }
 abstract function write();
 abstract function read();
}


class XmlParamHandler extends ParamHandler {
 function write() {
 // zapis tablicy parametrów $this->params w pliku XML
 }
 function read() {
 // odczyt pliku XML i wypełnienie tablicy parametrów $this->params
 }
}
class TextParamHandler extends ParamHandler {
 function write() {
 // zapis tablicy parametrów $this->params w pliku tekstowym
 }
 function read() {
 // odczyt pliku tekstowego i wypełnienie tablicy parametrów $this->params
 }
}
abstract class Lesson {
 private $duration;
 private $costStrategy;
 function __construct($duration, CostStrategy $strategy) {
 $this->duration = $duration;
 $this->costStrategy = $strategy;
 }
 function cost() {
 return $this->costStrategy->cost($this);
 }
 function chargeType() {
 return $this->costStrategy->chargeType();
 }
 function getDuration() {
 return $this->duration;
 }
 // pozostałe metody klasy Lesson…
}
class Lecture extends Lesson {
 // implementacja właściwa dla wykładów...
}
class Seminar extends Lesson {
 // implementacja odpowiednia dla seminariów...
}



 Oto przebieg delegowania:
function cost() {
 return $this->costStrategy->cost($this);
}
A oto klasa CostStrategy wraz z jej klasami pochodnymi:
abstract class CostStrategy {
 abstract function cost(Lesson $lesson);
 abstract function chargeType();
}
class TimedCostStrategy extends CostStrategy {
 function cost(Lesson $lesson) {
 return ($lesson->getDuration() * 5);
 }
 function chargeType() {
 return "stawka godzinowa";
 }
}
class FixedCostStrategy extends CostStrategy {
 function cost(Lesson $lesson) {
 return 30;
 }
 function chargeType() {
 return "stawka stała";
 }
}

 

class RegistrationMgr {
 function register(Lesson $lesson) {
 // jakieś operacje na obiekcie Lesson
 // i odpowiednie powiadomienie
 $notifier = Notifier::getNotifier();
 $notifier->inform(
 "nowe zajęcia: koszt ({$lesson->cost()})" );
 }
}
abstract class Notifier {
 static function getNotifier() {
 // pozyskanie konkretnej klasy odpowiedniej dla
 // konfiguracji bądź stanu logiki
 if ( rand(1,2) == 1 )
 else {
 return new TextNotifier();
 }
}
abstract function inform($message);
}
class MailNotifier extends Notifier {
 function inform($message) {
 print "powiadomienie w trybie MAIL: {$message}\n";
 }
}
class TextNotifier extends Notifier {
 function inform($message) {
 print "powiadomienie w trybie TEXT: {$message}\n";
 }
}
Komentarze wyłączone