责任链模式和php实现

职责链模式(又叫责任链模式):
  包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。

角色:
  抽象处理者:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
  具体处理者:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

UML类图:

     

适用场景:
  1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
  2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  3、可动态指定一组对象处理请求。

简单的总结责任链模式,可以归纳为:
  用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

代码实现:

<?php
//申请类,
header("Content-type:text/html;Charset=utf-8");
class Request{
    public $name;
    public $requestContent;
    public $num;
    public $reason;
    function __construct($name,$requestContent,$reason,$num){
        $this->name = $name;
        $this->requestContent = $requestContent;
        $this->reason = $reason;
        $this->num = $num;
    }
}

//抽象处理类,定义处理者具有的公共属性和具体处理类需要实现的接口
abstract class AbstractManager{
    protected $name;   //姓名
    protected $position;  //职位
    protected $head;  //上司
    function __construct($name,$position){
        $this->name = $name;
        $this->position = $position;
    }
     //设置上司
    function setHead(AbstractManager $head){
        $this->head = $head;
    }
    //处理申请
    abstract function handleRequest(Request $request);
}

//具体处理类,经理,可以处理不多于7天的假期和不多于1000元的加薪请求
class Director extends AbstractManager{
    function __construct($name,$position){
        parent::__construct($name,$position);
    }
    //处理申请
    function handleRequest(Request $request){
         if(($request->requestContent == "请假" && $request->num <7)||($request->requestContent == "加薪" && $request->num <1000) ){
              return $request->name."的".$request->requestContent."请求已被".$this->name."批准.";
         }else{  //超过处理权限转给上级总监处理
            if(isset($this->head)){
                return $this->head->handleRequest($request);
            }
         }
    }
}
//具体处理类,总监,可以处理不多于15天的假期和不多于2000元的加薪请求
class Majordomo extends AbstractManager{
    function __construct($name,$position){
        parent::__construct($name,$position);
    }
    //处理申请
    function handleRequest(Request $request){
         if(($request->requestContent == "请假" && $request->num <15)||($request->requestContent == "加薪" && $request->num <2000) ){
              return $request->name."的".$request->requestContent."请求已被".$this->name."批准.";
         }else{  //超过处理权限转给上级总经理处理
            if(isset($this->head)){
                return $this->head->handleRequest($request);
            }
         }
    }
}
//具体处理类,总经理,可以处理请假和加薪请求
class GeneralManager extends AbstractManager{
    function __construct($name,$position){
        parent::__construct($name,$position);
    }
    //处理申请
    function handleRequest(Request $request){
         if(($request->requestContent == "请假" && $request->num < 30)||($request->requestContent == "加薪" && $request->num <5000) ){
              return $request->name."的".$request->requestContent."请求已被".$this->name."批准.";
         }else{  //没有上级
            return $request->name."的".$request->requestContent."请求已被".$this->name."否决!";
         }
    }
}

//测试
$generalManagerWang = new GeneralManager("王五","总经理");
$majordomoLi = new Majordomo("李四","总监");
$majordomoLi->setHead($generalManagerWang);
$directZhang = new Director("张三","经理");
$directZhang->setHead($majordomoLi);

$request = new Request("叶良辰","请假","如果你有问题,可以随时找我,良辰就喜欢对自以为是的人出手",100);
$result = $directZhang->handleRequest($request);  //叶良辰的请假请求已被王五否决!
echo $result;
时间: 2024-11-09 05:44:01

责任链模式和php实现的相关文章

设计模式之责任链模式--- Pattern chain-of-responsibility

模式的定义 责任链模式定义如下: Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it. 使多个对象都有机会处理请求,从而避免请求的发送

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

JAVA设计模式(13):行为型-责任链模式(Responsibility)

定义 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求, 如果能则处理,如果不能则传递给链上的一个对象. 场景: 打牌时,轮流出牌 接力赛跑 大学中,奖学金审批 公司中,公文审批 开发中常见的场景: Java中,异常机制就是一种责任链模式.一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch. Javascript语言中,事件的冒泡和捕获机制.Java语言中,事件的处理采用观察者模式. Servlet开发中

设计模式_责任链模式

定义 Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求.从而避免了请求的发送者和接受者之间的耦合关系.

5 行为型模式之- 责任链模式

责任链模式介绍: 责任链模式是行为模式之一,什么是"链"?我们将多个节点首尾相连,就形成了链,对于链式结构,每个节点都可以拆开再重新连接,因此链式结构也具有很好的灵活性.将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从一个链的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种模式称为责任链模式. 责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这

责任链模式

案例分析 责任链模式可以通过形象的生活例子进行解读,不管是前端攻城狮还是后端攻城狮,责任链的思想都有所体现(框架之中) 击鼓传花 老太和一群姑娘准备玩击鼓传花的游戏,于是找来了一个击鼓的人,游戏规则就是:随着鼓点声音,从她们之间传递一束花,鼓声落,传花停.花最后传递到那个姑娘的手中,那么就由她来给大家即兴赋诗一首. 那么击鼓的人并不需要知道玩游戏的这些人是谁,只需要击鼓即可,相当于客户端发送一个请求,请求在这些姑娘之间传递,总会有一个姑娘最后接到花,给大家赋诗.(一层层的传递请求,总会有一层来对

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

责任链模式:定义 责任链接模式又称职责链模式,是一种对象的行为模式:它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求:该模式定义了一些可能的处理请求的节点对象,请求的起点跟顺序都可能不一样,处理的节点根据请求的不一样而不同:请求者不必知道数据处理完成是由谁来操作的,内部是一个黑箱的操作过程,这是它的一个核心内容: 责任链模式:角色 抽象处理者角色:定义处理方法,以配置是否具有下个节点(Handler)对象; 具体处理者角

设计模式学习-责任链模式

1.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 2.类图 3.代码示例 1 package com.zhaoyangwoo.chainOfResponsibility; 2 3 /** 4 * Created by john on 16/6/16. 5 * 职责链模式,经费审批场景 6 */ 7 public class Responsibility { 8 9 public static void

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

责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任.Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口. 为了方便理解,责任链模式直接用马士

chainOfResponsibility责任链模式

责任链(Chain of Responsibility)模式 : 责任链模式是对象的行为模式.使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系.将这些处理对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止.责任链模式强调的是每一个对象及其对下家的引用来组成一条链,利用这种方式将发送者和接收者解耦,类图如下: 通过上图可以看出责任链模式有两个角色: 抽象处理者(Handler)角色 :定义一个请求的接口.如果需要可以定义个一个方法用来设定和返回下家对象的引用. 具