PHP實現常用設計模式之責任鏈模式

責任鏈模式是一種設計模式。在責任鏈模式裏,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
看下面的案例:
面向過程實現舉報功能

<!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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章