实现这一目标的最佳方法是什么(可能使用某种设计模式)?
假设我们有3个阶段来处理用户输入,在每个阶段数据被验证/转换,如果成功,则执行下一步骤。如果上一步失败,则不需要继续下一步。
class PipeAndFilter
{
protected $input;
protected $proceedToNextStep;
public function __construct(Array $input)
{
$this->input=$input;
$this->proceedToNextStep=true;
}
public function process()
{
$this->filterOne();
if(!$this->proceedToNextStep()) return false;
$this->filterTwo();
if(!$this->proceedToNextStep()) return false;
$this>filterThree()
return $this->proceedToNextStep();
}
protected function filterOne()
{
//perform some action and set
//$this->proceedToNextStep
}
protected function filterTwo()
{
//perform some action and set
//$this->proceedToNextStep
}
protected function filterThree()
{
//do some filter and set
//$this->proceedToNextStep
}
}
我认为上述课程足以描述问题。是否有更好的方法/设计模式来完成这项任务,可能使用单一类?
修改 有另一种方法,请你的意见! (未经测试)
class PipeAndFilter
{
protected $callStack
protected $input;
/** fail states -ve numbers , success stats +ve numbers */
protected $proceedToNextStep;
public function __construct(Array $input)
{
$this->input=$input;
$this->callStack=array();
$this->callStack[]=array($this,'filterOne'));
$this->callStack[]=array($this,'filterTwo'));
$this->callStack[]=array($this,'filterThree'));
}
public function process()
{
foreach($this->callStack as $filterStep){
call_user_func($filterStep);
if(!$this->isProceedNext()) break;
}
}
protected function isProceedNext()
{
return $this->proceedToNextStep > 0
}
protected function filterOne()
{
//perform some action and set $this->proceedToNextStep
}
protected function filterTwo()
{
//perform some action and set $this->proceedToNextStep
}
protected function filterThree()
{
//perform some action and set $this->proceedToNextStep
}
}
答案 0 :(得分:1)
我要看一下chain of responsibility模式。
链中的每个处理程序在输入(验证/转换)上执行它的操作并调用下一个处理程序,或者如果失败则停止执行。