設(shè)計模式(十七):職責(zé)鏈模式

轉(zhuǎn)載請注明作者和出處http://www.itdecent.cn/p/b77f5a97fee9

運行平臺: Windows

php版本: php7.0

作者簡介: 一個本該成為游戲職業(yè)選手卻被編程耽誤的程序員


指責(zé)鏈模式

職責(zé)鏈模式,類似于我們在公司發(fā)送一個加薪的申請,首先主管看了,發(fā)現(xiàn)沒有權(quán)限,轉(zhuǎn)交給經(jīng)理,經(jīng)理看了,發(fā)現(xiàn)也沒有權(quán)限,轉(zhuǎn)交給總監(jiān),總監(jiān)經(jīng)過調(diào)查,發(fā)現(xiàn)你的表現(xiàn)還可以,于是同意了你的申請,這樣一個鏈?zhǔn)絺鬟f就是職責(zé)鏈模式。

責(zé)任鏈模式定義:

在責(zé)任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責(zé)任。

責(zé)任鏈模式角色:

  • 抽象處理者(Handler)角色:定義出一個處理請求的接口。如果需要,接口可以定義 出一個方法以設(shè)定和返回對下家的引用。
  • 具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
<?php

// 減免類
class Reduce{
    // 減免金額
    public $reduceMoney;
}

// 審批抽象類(需要具體審批類實現(xiàn))
abstract  class Manager{
    // 審批角色
    protected $roleName;

    // 上級審批對象
    protected $managerObj;

    // 設(shè)置審批角色名稱
    public function __construct($roleName) {
        $this->roleName = $roleName;
    }

    // 設(shè)置當(dāng)前審批角色的上級角色
    public function setLeader(Manager $manager){
        $this->managerObj = $manager;
    }

    //審批方法
    abstract function audit(Reduce $reduce);
}

class LeaderManager extends Manager{
    //可減免金額最大值
    CONST REDUCE_MONEY = 1000;

    //執(zhí)行審批
    public function audit(Reduce $reduce) {
        if($reduce->reduceMoney > self::REDUCE_MONEY){
            //轉(zhuǎn)發(fā)上級角色審批
            $this->managerObj->audit($reduce);
        }else{
            echo $this->roleName."審批通過".PHP_EOL;
        }
    }
}

class ZongJianManager extends Manager{

    //可減免金額最大值
    CONST REDUCE_MONEY = 10000;

    //執(zhí)行審批
    public function audit(Reduce $reduce) {
        if($reduce->reduceMoney > self::REDUCE_MONEY){
            //轉(zhuǎn)發(fā)上級角色審批
            $this->managerObj->audit($reduce);
        }else{
            echo $this->roleName."審批通過".PHP_EOL;
        }
    }
}

class BossManager extends Manager{
    //可減免金額最大值
    CONST REDUCE_MONEY = 100000;

    //執(zhí)行審批
    public function audit(Reduce $reduce) {
        if($reduce->reduceMoney > self::REDUCE_MONEY){
            //轉(zhuǎn)發(fā)上級角色審批
            echo $this->roleName."審批拒絕".PHP_EOL;
        }else{
            echo $this->roleName."審批通過".PHP_EOL;
        }
    }
}

//客戶端調(diào)用
$manage1 = new LeaderManager('組長');
$manage2 = new ZongJianManager('總監(jiān)');
$manage3 = new BossManager('老板');

//實例化請求減免類
$reduce = new Reduce();
$reduce->reduceMoney = 1000000;
//設(shè)定層級關(guān)系
$manage1->setLeader($manage2);
$manage2->setLeader($manage3);

$manage1->audit($reduce);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容