楼主: 
rickysu (Ricky)   
2014-03-24 10:59:01当叙述中越来越多 if else 或是充斥一堆 switch case时,debug 上是相当困难的。
要实作 unit test 也会增加不少困难度。
要解决这样的问题会比较建议采用 Chain of Responsibility 模式(责任链模式)
<?php
abstract class Handler
{
    protected $nextHandler;
    abstract function handle($number);
    public function __construct(Handler $handler = null)
    {
        if($handler !== null){
            $this->addNextHandler($handler);
        }
    }
    public function addNextHandler(Handler $handler)
    {
        $this->nextHandler = $handler;
    }
    protected function handleNext($number)
    {
        if($this->nextHandler !== null){
            $this->nextHandler->handle($number);
        }
    }
}
class lessThan extends Handler //负责处理小于的状况
{
    function handle($number)
    {
        if($number < 5)
        {
            echo "$number < 5\n";
            return;
        }
        $this->handleNext($number);
    }
}
class equal extends Handler //负责处理等于的状况
{
    function handle($number)
    {
        if($number == 5)
        {
            echo "$number == 5\n";
            return;
        }
        $this->handleNext($number);
    }
}
class greaterThan extends Handler //负责处理大于的状况
{
    function handle($number)
    {
        if($number > 5)
        {
            echo "$number > 5\n";
            return;
        }
        $this->handleNext($number);
    }
}
$handler = new lessThan(new equal(new greaterThan()));
$handler->handle(1); //输出 1 < 5
$handler->handle(5); //输出 5 == 5
$handler->handle(6); //输出 6 > 5
责任炼顾名思义如果我能处理就接下来处理,如果不能处理就继续往下丢,
直到处理完成为止。
这样的好处是可以针对个别的 handler 做 unit test,另外当我要新增或是移除某个
handler 时也相当简单不需要大幅度的变动整个 code。