策略模式
namespace strategy;
//策略模式,按照组合优于继承原则
//问题抽象类
abstract class Question {
protected $promot;
protected $marker;
public function __construct($promot, Marker $marker)
{
$this->promot = $promot;
$this->marker = $marker;
}
public function mark($response)
{
return $this->marker->mark($response);
}
}
class TextQuestion extends Question
{
//处理文本问题特有的操作
}
class AVQuestion extends Question
{
//处理语音问题特有的操作
}
//标记方式抽象类
abstract class Marker
{
protected $type;
protected $reponse;
public function __construct($type)
{
$this->type = $type;
}
abstract public function mark($reponse);
}
class MarkLogicMarker extends Marker {
private $engine;
public function __construct($type)
{
parent::__construct($type);
}
public function mark($reponse)
{
//return $this->engine->evaluate($reponse);
return true;
}
}
class MatchMarker extends Marker
{
public function mark($reponse)
{
return ($this->type == $reponse);
}
}
class RegexpMarker extends Marker
{
public function mark($reponse)
{
return (preg_match($this->type, $reponse));
}
}
$markers = array(
new RegexpMarker('/f.ve/'),
new MatchMarker('five'),
new MarkLogicMarker('$input equals "five"')
);
foreach ($markers as $marker) {
var_dump(get_class($marker));
$question = new TextQuestion("how many beans make five", $marker);
foreach (array('five', 'four') as $reponse) {
if ($question->mark($reponse)) {
var_dump($reponse . ': well done');
} else {
var_dump($reponse . ': never mind');
}
}
}
/*
strategy\RegexpMarker
five: well done
four: never mind
strategy\MatchMarker
five: well done
four: never mind
strategy\MarkLogicMarker
five: well done
four: well done
*/