php核心学习-设计模式的学习-责任链模式

来源:互联网 发布:mysql复杂查询实例 编辑:程序博客网 时间:2024/06/03 20:13

一、什么是责任链模式

  责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
  责任链模式的特点点主要是:
  1、有多个对象共同对一个任务进行处理。
  2、这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。
  3、一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。
  3、客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。
这些解释都是java方面的解释,不同语言,其实设计模式还是有点区别的,现在我们使用的是php实现责任链设计模式,我们使用一个场景来带入我们的设计模式学习当中,使用责任链模拟多步用户注册过程。

二、模式代码
用户注册处理器借口

abstract class UserReg{    public $step="step1";//当前状态,这个很重要    public $next=false;//下一节点    public $last=false;//上一节点    public function setNextStep($object)    {        $this->next=$object;        $object->last=$this;    }    public function stepNext($user){        //只有当user的state和自己的mystate 相等时才会处理        if($user->step==$this->step) //代表当前状态 是自己要处理的 状态        {            //判断 自己的下一个节点是否存在,如果存在则把控制权交给下一个节点            if($this->next)            {                $user->step=$this->next->step;//交控制权                return $user;            }        }        else        {            if($this->next)              return  $this->next->stepNext($user);        }    }}

用户注册第一步处理接口

class UserInfo extends UserReg{    public $step="step1";    public function stepNext($user)    {        //假设这步 需要把用户初始信息保存到数据库。这里我们保存到session        if($user==null)        {            $user=new UserEntity();            $user->user_name=$_POST["user_name"];            $user->user_pass=$_POST["user_pass"];            //模拟用户入库            $_SESSION["user"]=json_encode($user);        }         $get_user=parent::stepNext($user); // TODO: Change the autogenerated stub        if($get_user)        {            //模拟保存用户            $_SESSION["user"]=json_encode($get_user);        }    }}

用户注册第二步处理接口

class UserPhone extends UserReg{    public $step="step2";    public function stepNext($user)    {        $user->user_phone=$_POST['user_phone'];        $get_user=parent::stepNext($user); // TODO: Change the autogenerated stub        if($get_user)        {            $_SESSION["user"]=json_encode($get_user);        }    }}

用户注册第三步接口

class UserSuccess extends UserReg{    public $step="step3";    public function stepNext($user)    {        //继续执行业务        $get_user=parent::stepNext($user); // TODO: Change the autogenerated stub        if($get_user)            $_SESSION["user"]=json_encode($get_user);    }}

客户端调用

        $userInfo=new UserInfo();        $userPhone=new UserPhone();        $userSuccess=new UserSuccess();        $userInfo->setNextStep($userPhone);        $userPhone->setNextStep($userSuccess);        $userInfo->stepNext(getUser());

当你执行到第二步退出的时候,重新注册,系统还是从之前退出的状态继续注册,简单的模拟差不多是这样子,仅提供设计模式思想。

原创粉丝点击