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";
}
}