<?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>

【PHP设计模式 07_ZeRenLian.php】责任链模式的更多相关文章

  1. Python使用设计模式中的责任链模式与迭代器模式的示例

    Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...

  2. Java设计模式学习记录-责任链模式

    前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...

  3. 《java设计模式》之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  4. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  5. [设计模式] javascript 之 责任链模式

    责任链模式:定义 责任链接模式又称职责链模式,是一种对象的行为模式:它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求:该模式 ...

  6. Java设计模式系列之责任链模式

    责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...

  7. 设计模式学习之责任链模式(Chain of Responsibility,行为型模式)(22)

    参考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1 ...

  8. Java描述设计模式(15):责任链模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...

  9. Java设计模式13:责任链模式

    前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时间去提升自己的技术能力.技术视野,所以开一个系列文章,标题就轻松一点叫做最 ...

  10. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

随机推荐

  1. UIImagePickerController

    1.+(BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType;                 检查指定源是 ...

  2. Java基础之创建窗口——使用网格布局管理器(TryGridLayout)

    控制台程序. 网格布局管理器可以在容器的矩形网格中布局组件. import javax.swing.*; import java.awt.*; import javax.swing.border.Et ...

  3. Java基础之集合框架——使用集合Vector<>挑选演员(TryVector)

    控制台程序. public class Person implements Comparable<Person> { // Constructor public Person(String ...

  4. 原来现在很多人都用SignalR来实现Chat Room

    今天从一个业余开发的群里,看到有人要求这样一个项目需求: 1,)学员可以通过在线课堂找到自己喜欢的老师和课程. 2,)每个人可以建立自己课堂,每个课堂扣分多个子房间,交流群.设置管理员:有录音功能,可 ...

  5. redhat vim编辑器永久添加行号

    cd ~ vim .vimrc 第一行加入: set nu :wq 保存退出,即可 如果想取消设置,同理删除set nu即可

  6. mysql的binlog安全删除

    理论上,应该在配置文件/etc/my.cnf中加上binlog过期时间的配置项,expire_logs_days = 10 但是如果没有加这一项,随着产生越来越多的binlog,磁盘被吃掉了不少.可以 ...

  7. DO.NET操作数据库

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. CentOs5.2中PHP的升级

    最近一个项目中需要使用到PHP5.2的版本,而服务器上使用了官方的yum源进行安装,默认的版本是5.1.6,需要升级.但是因为不是一个非常 正式的服务器环境,所以想通过简单的yum update一下了 ...

  9. 去掉list重复值

    /** * 去掉list重复值 */ public List<String> removeDuplicate(List<String> list) { HashSet<S ...

  10. linux下的网络配置

    临时生效的命令: 设置静态ip: ip addr add 192.168.1.2/24 dev eth0 设置网关: ip route add default via 192.168.1.1 启动某个 ...