<?php
/**
* 职责链的组织可写在配置文件里
* 每个职责类可对同一个请求选择性的处理,之后可交由下一个类处理,也可终止
* 抽象出职责类 Handler,每个具体的职责类处理各自的事情
*/
abstract class Handler {
protected $_handlerName = null;
protected $_nextHandler = null;
public function __construct($handleName) {
$this->_handlerName = $handleName;
}
public function setNextHandler(Handler $hander) {
$this->_nextHandler = $hander;
}
public function handerRequest(Request $request) {
echo $this->_handlerName." handerRequest\n";
if($this->doRequest($request) === false && $this->_nextHandler) {
return $this->_nextHandler->handerRequest($request);
}
return true;
}
/**
* return: true/终止处理,false/由后面的职责对象继续处理
*/
abstract public function doRequest(Request $request);
}
class Leader extends Handler {
public function doRequest(Request $request) {
if($request->day <= 0.5) {
echo "\t".__METHOD__." do it\n";
return true;
}
echo "\t".__METHOD__." kown it\n";
return false;
}
}
class Manager extends Handler {
public function doRequest(Request $request) {
if($request->day <= 3 && $request->day > 0.5) {
echo "\t".__METHOD__." do it\n";
return true;
}
echo "\t".__METHOD__." kown it\n";
return false;
}
}
class GeneralManager extends Handler {
public function doRequest(Request $request) {
if($request->day > 3) {
echo "\t".__METHOD__." do it\n";
return true;
}
echo "\t".__METHOD__." kown it\n";
return false;
}
}
class Request {
private $_day;
private $_name;
private $_reason;
public function __construct($name, $day, $reason) {
$this->_name = $name;
$this->_day = $day;
$this->_reason = $this->$reason;
}
public function __set($name, $value) {
$item = '_'.$name;
$this->$item = $value;
}
public function __get($name) {
$item = '_'.$name;
if(property_exists($this, $item)) {
return $this->$item;
}
return null;
}
}
class Client {
public static function main() {
$leader = new Leader('leader');
$manager = new Manager('manager');
$generalManager = new GeneralManager('generalManager');
$leader->setNextHandler($manager);
$manager->setNextHandler($generalManager);
echo "-----1-------\n";
$leader->handerRequest(new Request('lijie', 0.5, '打牌'));
echo "-----2-------\n";
$leader->handerRequest(new Request('lijie', 3, '打牌'));
echo "-----3-------\n";
$leader->handerRequest(new Request('lijie', 5, '打牌'));
}
}
Client::main();