?php
/**
* @desc php設計模式之職責鏈模式(責任鏈模式)
定義:顧名思義,責任鏈模式為請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬于行為型模式。
在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。
* 模擬公司請假流程,實現職責鏈模式
* 項目主管:有1天的批假權限
* 項目經理:有3天的批假權限
* 公司老板:任性似的權限看心情
* 此模式有兩個角色:1請求員工角色,2領導管理者角色
* **/
//員工類
class staff{
public $name;//員工姓名
public $department;//部門名稱
public $days;//請假天數
public function __construct($name,$department,$days){
$this->name = $name;
$this->department = $department;
$this->days = $days;
}
}
//創建抽象管理者類
abstract class manager{
public $manager;//設置管理者上級
public function __construct($name){
$this->name = $name;
}
//設置處理申請的上級管理對象
public function setHeader(manager $manager){
$this->manager = $manager;
}
//請假申請處理方法
abstract public function apply(staff $staff);
}
//項目經理請假申請處理類
class charge extends manager{
public $name;//管理者姓名
public function __construct($name){
parent::__construct($name);
}
/**
* @desc 審批請假
* **/
public function apply(staff $staff){
if($staff->days=1){
echo "{$staff->department}的{$staff->name}你的請假已批準,審批天數{$staff->days},審核人項目主管:{$this->name}".PHP_EOL;
}else{
$this->manager->apply($staff);
}
}
}
/**
* @desc 項目經理審批類
* **/
class projectManager extends manager{
public function __construct($name){
parent::__construct($name);
}
/**
* @desc 審批請假
* **/
public function apply(staff $staff){
if($staff->days=3){
echo "{$staff->department}的{$staff->name}你的請假已批準,審批天數{$staff->days},審核人項目經理:{$this->name}".PHP_EOL;
}else{
$this->manager->apply($staff);
}
}
}
/**
* @desc 老板審批類
* **/
class boss extends manager{
public function __construct($name){
parent::__construct($name);
}
/**
* @desc 審批請假
* **/
public function apply(staff $staff){
if($staff->days>3 $staff->days=5 ){
echo "{$staff->department}的{$staff->name}你的請假已批準,審批天數{$staff->days},審核人ceo:{$this->name}".PHP_EOL;
}else{
echo "{$staff->department}的{$staff->name}你的請假天數過長,未批準,審批人ceo:{$this->name}".PHP_EOL;
}
}
}
//實例化管理者類
$manager = new charge("尹志平");
$projectManager = new projectManager("令狐沖");
$boss = new boss("風清揚");
//設置管理類的上次管理對象實例
$manager->setHeader($projectManager);
$projectManager->setHeader($boss);
//申請請假1天
$staff = new staff('劉德華', '技術部', 1);
$manager->apply($staff);
//申請請假3天
$staff = new staff('周潤發', '技術部', 2);
$manager->apply($staff);
//申請請假5天
$staff = new staff('張學友', '技術部', 5);
$manager->apply($staff);
//申請請假7天
$staff = new staff('劉亦菲', '技術部', 7);
$manager->apply($staff);
/**
拿這個請假的案例通俗的理解就是:每次請假申請都是從最接近自己的領導開始,一層一層的往上遞,直到有人處理結束,更通俗的講就是你給我發一個請求,我如果
有處理權限就直接處理了,如果權限不足就往更上一級別傳遞直到審核通過結束
* **/
/*運行結果
技術部的劉德華你的請假已批準,審批天數1,審核人項目主管:尹志平
技術部的周潤發你的請假已批準,審批天數2,審核人項目經理:令狐沖
技術部的張學友你的請假已批準,審批天數5,審核人ceo:風清揚
技術部的劉亦菲你的請假天數過長,未批準,審批人ceo:風清揚
*/
更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》