来自 计算机编程 2019-12-29 05:22 的文章
当前位置: 澳门威尼斯人平台 > 计算机编程 > 正文

PHP中简单的伪责任链模式(一)

概述责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态的重新组织和分配责任

PHP中对进行链式验证(常见于登录的验证)

下面以表单提交进行演示

创建验证的抽象类`FormValidate

<?php
/**
* Created by PhpStorm.
* User: iamcyan
* Date: 2017/6/30
* Time: 13:19
*/

namespace AppServicesValidate;

use IlluminateHttpRequest;
/**
* Class TestValidtate
* @package AppServicesValidate
*/
abstract class FormValidtate
{
  //定义一个属性存储责任链实例
  protected $nextHandler;

  final public function setNext(FormValidtate $formValidtate)
  {
      $this->nextHandler = $formValidtate;
  }

  final public function handle(Request $request)
  {
      if (!$this->handleFormCondition($request)) {
          return false;
      }
      $this->nextHandler->handleFormCondition($request);
  }


  abstract public function handleFormCondition(Request $request);


}

创建两个类TestForm1、TestForm2继承自FormValidate

<?php
/**
 * Created by PhpStorm.
 * User: iamcyan
 * Date: 2017/6/30
 * Time: 13:45
 */

namespace AppServicesValidateForm;

use AppServicesValidateFormValidtate;
use IlluminateHttpRequest;
class TestForm1 extends FormValidtate
{


    public function handleFormCondition(Request $request)
    {
        if ($request->get('test1') == 'test1') {
            echo 'testForm1---success';
            return true;
        } else {
            echo 'testForm1---fail';
            return false;
        }

    }
}

<?php
/**
 * Created by PhpStorm.
 * User: iamcyan
 * Date: 2017/6/30
 * Time: 14:32
 */

namespace AppServicesValidateForm;


use AppServicesValidateFormValidtate;
use IlluminateHttpRequest;

class TestForm2 extends FormValidtate
{

    public function handleFormCondition(Request $request)
    {
        if ($request->get('test2') == 'test2') {
            echo 'testForm2---sucess'.PHP_EOL;
            return true;
        } else {
            echo 'testForm2---fail';
            return false;
        }

    }

}

在控制器中进行访问

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use AppServicesValidateFormTestForm1;
use AppServicesValidateFormTestForm2;
class FormController extends Controller
{
    protected $testForm1;
    protected $testForm2;

    public function __construct(TestForm1 $testForm1, TestForm2 $testForm2)
    {
        $this->testForm1 = $testForm1;
        $this->testForm2 = $testForm2;
    }

    public function create()
    {
        $array = [[1,2,3], [4,5,6], [7,8,9]];
        $res = array_collapse($array);
        var_dump($res);
        $res = array_collapse($res);
        dd($res);


        return view('form.index');
    }

    public function store(Request $request)
    {
        $this->testForm1->setNext($this->testForm2);
        $this->testForm1->handle($request);

    }
}

上面的这种写法是以一种面向对象的思维对多个验证条件进行链式验证
即 条件1:true->条件2:true->条件3:true.....。没有其他的额外的分支。

责任链模式的定义使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。责任链模式的优点最为显著的优点就是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。责任链模式的缺点一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个问题。二是调试不是很方便,特别是链条比较长的,环节比较多的时候,由于采用了类似递归的方式 ,调试的时候逻辑可能比较复杂。

责任链模式涉及到的角色如下:

抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个php的抽象类或接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作 具体处理者(ConcreateHandle)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理这可以访问下家

本文由澳门威尼斯人平台发布于计算机编程,转载请注明出处:PHP中简单的伪责任链模式(一)

关键词: