php核心学习-设计模式的学习-责任链模式
2017-08-22 10:53
656 查看
一、什么是责任链模式
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链模式的特点点主要是:
1、有多个对象共同对一个任务进行处理。
2、这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。
3、一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。
3、客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。
这些解释都是java方面的解释,不同语言,其实设计模式还是有点区别的,现在我们使用的是php实现责任链设计模式,我们使用一个场景来带入我们的设计模式学习当中,使用责任链模拟多步用户注册过程。
二、模式代码
用户注册处理器借口
用户注册第一步处理接口
用户注册第二步处理接口
用户注册第三步接口
客户端调用
当你执行到第二步退出的时候,重新注册,系统还是从之前退出的状态继续注册,简单的模拟差不多是这样子,仅提供设计模式思想。
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链模式的特点点主要是:
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());
当你执行到第二步退出的时候,重新注册,系统还是从之前退出的状态继续注册,简单的模拟差不多是这样子,仅提供设计模式思想。
相关文章推荐
- php核心学习-设计模式的学习-观察者模式
- php核心学习-设计模式的学习-注册树模式
- php核心学习-设计模式的学习-委托模式
- php核心学习-设计模式的学习-简单工厂模式
- 学习PHP设计模式之观察者模式
- HeadFirst 设计模式学习笔记15--责任链模式拾零
- php 设计模式的学习与实用[一 Strategy ]
- 学习php设计模式 php实现原型模式(prototype)
- 学习php设计模式 php实现原型模式(prototype)
- 学习php设计模式 php实现合成模式(composite)
- php设计模式学习之观察者模式
- PHP面向对象学习笔记之二 生成对象的设计模式
- 学习php设计模式 php实现单例模式(singleton)
- 学习php设计模式 php实现工厂模式(factory)
- 用星际学习PHP设计模式3-抽象工厂模式[转]
- 深入理解PHP:高级技巧、面向对象与核心技术(原书第3版) -- 设计模式之单一模式
- 学习php设计模式 php实现建造者模式
- 学习php设计模式 php实现建造者模式
- 学习php设计模式 php实现门面模式(Facade)