5、php責任鏈模式

weixin_34320159發表於2018-07-14

先說責任鏈模式的使用場景
舉個例子
程式導向的舉報功能
有這麼一個html頁面

        <form action="process.php" method="post">

            <select name='judge'>
              <option value ="1">侮辱詞彙</option>
              <option value ="2">垃圾廣告</option>
              <option value="3">黃賭毒</option>
              
            </select>
            <input type="submit" value="舉報"/>
        </form>

很簡單,對某些內容進行舉報,那麼php那邊大概就是那麼寫的

$judge = $_POST['judge'];
class Editor
{
    public function process()
    {
        echo '禁言';
    }
    
}
class Admin
{
    public function process()
    {
        echo '刪帖';
    }
    
}

class Boss
{
    public function process()
    {
        echo '關進小黑屋';
    }
}
if($judge==1)
{
    $editor = new Editor();
    $editor->process();
}else if($judge==2)
{
    $admin = new Admin();
    $admin->process();
}else if($judge ==3)
{
    $boss = new Boss();
    $boss->process();
}

根絕value值的不同判斷建立不同的使用者,並且執行他們各自的處理方法,這種處理方法是程式導向的。
如果說,這個時候,要增加一個新的處理,比方說,犯罪,他的value是4,那麼或許php處理的時候我們需要new一個police例項,進行處理,ifelse裡面也要跟進,這樣就意味著要對類內部的ifelse進行修改,改動原來的程式碼,不妥當。

需要一個方法來對判斷他的策略。

$judge = $_POST['judge'];
$re = new Editor();
$re->process($judge);
class Editor
{
    protected $power = 1;
    protected $top='Admin';
    public function process($power)
    {
        if($this->power >= $power )
        {
            echo '禁言';
        }else
        {
            $top = new $this->top;
            $top->process($power);
        }
        
    }
    
}
class Admin
{
    protected $power = 2;
    protected $top='Boss';
    public function process($power)
    {
        if($this->power >= $power )
        {
            echo '刪帖';
        }else
        {
            $top = new $this->top;
            $top->process($power);
        }
        
    }
    
}

class Boss
{
    protected $power = 3;
    protected $top=null;
    public function process($power)
    {

            echo '關進小黑屋';
    }
    
}

建立一個類,這個類有一個方法,叫做progress,方法,和一個當前等級的變數和一個記錄下一個等級類名的變數。
如果傳入的引數小於等於當前的等級,那麼說明當前等級足以處理這個錯誤,如果不能處理,建立下一個等級的類,然後呼叫同名處理函式。
這樣就不用修改類的整體結構的情況下可以無限增加新的類。責任鏈,完成

相關文章