C#实现:http://www.lemongtree.com/Archives/Chain_of_Responsibility.aspx
Handler:传递者接口,定义一个处理请求的接口;实现链中下一个对象(可选)
ConcreteHandler:具体传递者,处理它所负责的请求;可以访问链中下一个对象,如果可以处理请求就处理它,否则将请求传递给下一个对象。
Client:客户端应用程序。
实际生活中的例子:
员工请假,部门经理可以批3天以下的假期,中心总监可批5天以下的假期,副总裁可批10天以下的假期,CEO可以批20天以下假期,超过20天需要开会决定。
示例:
<?php
// "Handler"
//传递者抽象类
abstract class Handler
{
protected $successor; //维护它的下一个处理对象
public function setSuccessor(Handler $successor)
{
$this->successor = $successor;
}
//处理方法
public abstract function handleRequest($request);
}
// 部门经理
class ConcreteHandler1 extends Handler
{
public function handleRequest($request)
{
if ($request >= 0 && $request <= 3)
{
printf(" %s 天假期已由部门经理批示\r\n",$request);
}
else if ($this->successor != null)
{
$this->successor->handleRequest($request);
}
}
}
// 中心总监
class ConcreteHandler2 extends Handler
{
public function handleRequest($request)
{
if ($request >= 4 && $request < 6)
{
printf(" %s 天假期已由中心总监批示\r\n", $request);
}
else if ($this->successor != null)
{
$this->successor->handleRequest($request);
}
}
}
//副总裁
class ConcreteHandler3 extends Handler
{
public function handleRequest($request)
{
if ($request >=6 && $request < 11)
{
printf(" %s 天假期已由副总裁批示\r\n", $request);
}
else if ($this->successor != null)
{
$this->successor->handleRequest($request);
}
}
}
//CEO
class ConcreteHandler4 extends Handler
{
public function handleRequest($request)
{
if ($request >= 11 && $request < 21)
{
printf(" %s 天假期已由CEO批示\r\n", $request);
}
else if ($this->successor != null)
{
$this->successor->handleRequest($request);
}
}
}
//开会决定
class ConcreteHandler5 extends Handler
{
public function handleRequest($request)
{
if ($request >= 21)
{
printf(" %s 天假期需要开会决定\r\n",$request);
}
else if ($this->successor != null)
{
$this->successor->handleRequest($request);
}
}
}
//example
$h1 = new ConcreteHandler1();
$h2 = new ConcreteHandler2();
$h3 = new ConcreteHandler3();
$h4 = new ConcreteHandler4();
$h5 = new ConcreteHandler5();
$h1->setSuccessor($h2);
$h2->setSuccessor($h3);
$h3->setSuccessor($h4);
$h4->setSuccessor($h5);
$requests = array(2, 5, 14, 22);
foreach ($requests as $request)
{
$h1->handleRequest($request);
}
?>