【PHP设计模式 07_ZeRenLian.php】责任链模式

时间:2023-03-09 06:02:40
【PHP设计模式 07_ZeRenLian.php】责任链模式
<?php
/**
 * 【责任链模式】
 * 情景设置:根据不同的需求,去找相应级别的责任人解决问题
 */

header("Content-type: text/html; charset=utf-8");

/* 面向过程的方式解决这个问题 */
if(isset($_POST['type1']) && !empty($_POST['type1'])){
    class Cun{
        public function process(){
            echo '去村委会,找村长解决问题。';
        }
    }
    class Zhen{
        public function process(){
            echo '去镇长办公室,找镇长解决问题。';
        }
    }
    class Xian{
        public function process(){
            echo '去县里,找县长解决问题';
        }
    }

    $type = $_POST['type1'];
    if($type == 1){
        $obj = new Cun();
    }elseif($type == 2){
        $obj = new Zhen();
    }elseif($type == 3){
        $obj = new Xian();
    }else{
        exit('错误的选项');
    }
    echo '(面向过程)';
    $obj->process();
}

/* 责任链模式 解决这个问题 */
if(isset($_POST['type2']) && !empty($_POST['type2'])){
    class CunZ{
        protected $power = 1; //假设“村长”的能力级别=1
        protected $top = 'Zhenz'; //假设“村长”的上级是“ZhenZ”
        public function process($lev){
            //如果匹配则处理,否则去找上一级
            if($lev == $this->power){
                echo '去村委会,找村长解决问题。';
            }else{
                $top = new $this->top;
                $top->process($lev);
            }
        }
    }

    class Zhenz{
        protected $power = 2; //假设“镇长”的能力级别=2
        protected $top = 'XianZ'; //假设“镇长”的上级是“XianZ”
        public function process($lev){
            //如果匹配则处理,否则去找上一级
            if($lev == $this->power){
                echo '去镇长办公室,找镇长解决问题。';
            }else{
                $top = new $this->top;
                $top->process($lev);
            }
        }
    }

    class Xianz{
        protected $power = null;
        protected $top = null; //假设“县长” 暂无上级
        public function process($lev){
            //因为没有了上级,所以直接处理
            echo '去县里,找县长解决问题';
        }
    }

    $type = $_POST['type2'];
    $obj = new CunZ();
    echo '(责任链)';
    $obj->process($type);

}

?>

<br><br><br><br>

<form action="?" method="post">
【面向过程】
<select name="type1">
    <option value="1">家庭纠纷(找村长)</option>
    <option value="2">土地赔偿(找镇长)</option>
    <option value="3">户口问题(找县长)</option>
</select>
<button type="submit">提交</button>
</form>

<form action="?" method="post">
【责任链模式】
<select name="type2">
    <option value="1">家庭纠纷(找村长)</option>
    <option value="2">土地赔偿(找镇长)</option>
    <option value="3">户口问题(找县长)</option>
</select>
<button type="submit">提交</button>
</form>