责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
看下面的案例:
面向过程实现举报功能
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>面向过程实现举报功能</title>
</head>
<body>
<form action="08-2.php" method="POST">
<select name="jubao" id="">
<option value="1">广告</option>
<option value="2">黄赌毒</option>
<option value="3">反对国家</option>
</select>
<input type="submit" name="" value="提交">
</form>
</body>
</html>
后端代码:
<?php
/*
面向过程实现举报功能
*/
header("content-type:text/html;charset=utf-8");
$lev = $_POST['jubao'] + 0;
class borde{
public function jubao(){
echo '版主删帖';
}
}
class admin{
public function jubao(){
echo '管理员封号';
}
}
class police{
public function jubao(){
echo '警察抓人';
}
}
if ($lev == 1) {
$jubao = new borde();
$jubao->jubao();
}else if ($lev == 2) {
$jubao = new admin();
$jubao->jubao();
}else{
$jubao = new police();
$jubao->jubao();
}
这里就有个问题,假如我们要增加一个责任人,我们就得修改客户端代码,增加一个分支判断,请求的发送者和接收者耦合性高
那么如何解决这个问题呢?就需要责任链模式了
责任链模式涉及到的角色如下所示:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用(可以不定义)。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
通过责任链模式,职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
代码如下:
<?php
/*
责任链模式完成举报功能
*/
header("content-type:text/html;charset=utf-8");
class borde{
protected $power = 1;
protected $top = 'admin';
public function process($lev){
if ($this->power >= $lev) {
echo '版主删帖';
}else{
$jege = new $this->top;
$jege->process($lev);
}
}
}
class admin{
protected $power = 2;
protected $top = 'policy';
public function process($lev){
if ($this->power>=$lev) {
echo '管理员封号';
}else{
$jege = new $this->top;
$jege->process($lev);
}
}
}
class policy{
protected $power;
protected $top = NULL;
public function process($lev){
echo '抓起来';
}
}
$lev = $_POST['jubao'] + 0;
$jege = new borde();
$jege->process($lev);