php設計模式-責任鏈模式

最近重構代碼發現責任鏈模式很是實用,因此簡單總結了一下。整體來講,責任鏈模式更像是一種簡化多種場景下調用處理的一種設計模式,特別適合if-else分支判斷不少的場景。好比是根據不一樣會員等級給予不一樣的優惠力度。php

它的定義:對象的調用是由下家的應用鏈接起來的處理鏈。一直不斷在鏈上傳遞,直到有某個對象能夠處理爲止。設計模式

 

我我的的理解:就像一我的要舉報某個高官貪污,要先從當地法院進行提案舉報,當地法院權限不足,而後將這個事兒繼續上報給中級人民法院,中級人民法院發現無權處理,又把舉報再上報給最高法,in the end 最高法依法受理。this

 

它的好處:spa

1.解耦。使用單一職責的處理類去處理不一樣場景條件下的業務,達到解耦,方便後期擴展和維護。設計

2.客戶端無感。請求方不用知道具體是哪一個處理類完成了請求處理,將處理過程交給系統內部。code

3.可擴展性。能夠動態從新組織鏈式和分配責任,當有新的case的時候就增長一個節點處理類便可,不用改變調用過程。orm

 

 具體例子以下:對象

<?php
/**
 * Created by PhpStorm.
 * User: tonny
 */

abstract class Handler {
    protected $higher = null;
    abstract public function operation($lev);
}

// 房間主人
class RoomMaster extends Handler { protected $higher = "admin"; public function operation($lev) { // TODO: Implement operation() method. if ($lev <= 1) { echo "房間主人搞定!"; } else { $higher = $this->higher; $this->higher = new $higher(); $this->higher->operation($lev); } } }
// 管理員
class Admin extends Handler { protected $higher = "God"; public function operation($lev) { // TODO: Implement operation() method. if ($lev <= 50) { echo "Admin搞定"; } else { echo "God搞定"; } } } $try = new RoomMaster(); $lev = rand(0, 100); $try->operation($lev);

總結:利用php的動態特性,將下一個節點的類保存在每一個處理類中的$higher變量中,經過$lev來判斷是當前處理類是否處理得過來,若是能處理則處理,不能處理則交給$higher。blog

相關文章
相關標籤/搜索