>백엔드 개발 >PHP 튜토리얼 >PHP 책임 체인 프로그래밍 모델

PHP 책임 체인 프로그래밍 모델

*文
*文원래의
2017-12-27 14:32:371420검색

이 글에서는 개발팀에서 널리 사용하는 프로그래밍 규칙이기도 한 PHP의 책임 사슬 프로그래밍 모델을 주로 소개합니다. 그것이 모두에게 도움이 되기를 바랍니다.

개요
책임 사슬 패턴은 객체 행동 패턴입니다. 책임 사슬 패턴에서는 많은 객체가 하위 객체에 대한 각 객체의 참조에 의해 연결되어 체인을 형성합니다. 요청은 체인의 개체가 요청을 처리하기로 결정할 때까지 체인 위로 전달됩니다. 요청한 클라이언트는 요청을 최종적으로 처리하는 체인의 어떤 개체인지 알 수 없으므로 시스템은 클라이언트에 영향을 주지 않고 동적으로 책임을 재구성하고 할당할 수 있습니다.


책임 체인 패턴 정의
여러 개 제공 요청을 처리할 수 있는 기회에 반대하여 요청의 송신자와 수신자 간의 결합 관계를 피하고 이러한 객체를 체인으로 연결하고 객체가 이를 처리할 때까지 이 체인을 따라 요청을 전달합니다.

책임 사슬 모델의 장점
가장 중요한 장점은 요청과 처리를 분리한다는 것입니다. 요청자는 누가 요청을 처리하는지 알 필요가 없으며 프로세서는 전체 요청을 알 필요가 없습니다. 이 두 가지가 분리되어 시스템의 유연성이 향상됩니다.

책임 체인 모델의 단점
첫 번째는 성능 문제입니다. 각 요청은 체인의 선두에서 체인의 끝까지 이동합니다. 특히 체인이 상대적으로 길면 성능이 문제가 됩니다. 둘째, 디버깅은 그리 편리하지 않습니다. 특히 체인이 비교적 길고 재귀적 방법을 사용하기 때문에 디버깅 중에 논리가 더 복잡해질 수 있습니다.


책임 사슬 모델에 관련된 역할은 다음과 같습니다.

 추상 핸들러(Handler) 역할: 요청을 처리하기 위한 인터페이스를 정의합니다. 필요한 경우 인터페이스는 다음 인터페이스에 대한 참조를 설정하고 반환하는 메서드를 정의할 수 있습니다. 이 역할은 일반적으로 PHP 추상 클래스 또는 인터페이스에 의해 구현됩니다. 위 그림에서 Handler 클래스의 집합 관계는 특정 서브클래스의 참조를 다음 홈에 제공합니다. 추상 메소드인 handlerRequest()는 요청을 처리하기 위해 서브클래스의 동작을 표준화합니다. 특정 핸들러(ConcreateHandle) 역할: 특정 핸들러 이후. 요청을 받으면 요청을 처리하거나 다음 당사자에게 전달하도록 선택할 수 있습니다. 특정 프로세서는 다음 홈에 대한 참조를 보유하므로 필요한 경우 특정 처리는 다음 홈에 액세스할 수 있습니다.

PHP 책임 체인 모델 프로그래밍 예를 살펴보겠습니다.

  <?php 
  /** 
   * 抽象处理者角色 
   * @author wzy 
   * 
   */ 
  abstract class Handle 
  { 

    /** 
     * 持有后继的责任对象 
     * 
     * @var object 
     */ 
    protected $successor; 
   
    /** 
     * 示意处理请求的方法,虽然这个示意方法是没有传入参素的 
     * 但实际是可以传入参数的,根据具体需要来选择是否传递参数 
     */ 
    public abstract function handleRequest (); 
   
    /** 
     * 取值方法 
     * 
     * @return object 
     */ 
    public function getSuccessor () 
    { 
      return $this->successor; 
    } 
   
    /** 
     * 赋值方法,设置后继的责任对象 
     * 
     * @param object $objsuccessor       
     */ 
    public function setSuccessor ($objsuccessor) 
    { 
      $this->successor = $objsuccessor; 
    } 
  } 
   
  /** 
   * 具体处理者角色 
   * 
   * @author wzy 
   *     
   */ 
  class ConcreateHandler extends Handle 
  { 
   
    /** 
     * 判断是否有后继的责任对象 
     * 如果有,就转发请求给后继的责任对象 
     * 如果没有,则处理请求 
     * 
     * @see Handle::handleRequest() 
     */ 
    public function handleRequest () 
    { 
      if ($this->getSuccessor() != null) { 
        echo "放过请求,将请求转发给后继的责任对象!<br>"; 
        $this->getSuccessor()->handleRequest(); 
      } else { 
        echo "处理请求,处理过程省略...<br>"; 
      } 
    } 
  } 
   
  /** 
   * 客户端代码 
   */ 
   
  // 组装责任链 
  $handle1 = new ConcreateHandler(); 
  $handle2 = new ConcreateHandler(); 
  $handle1->setSuccessor($handle2); 
   
  // 提交请求 
  $handle1->handleRequest(); 
  ?>

다음 코드에서 볼 수 있습니다. 클라이언트 두 개의 핸들러 객체가 생성되고 첫 번째 핸들러 객체의 다음 핸들러 객체가 두 번째 핸들러 객체로 지정되었지만 두 번째 핸들러 객체에는 다음 핸들러 객체가 없습니다. 그런 다음 클라이언트는 요청을 첫 번째 핸들러 객체


관련 권장 사항:

PHP 상태 패턴 프로그래밍

PHP 싱글턴 패턴 구현

php 팩토리 메소드 패턴

위 내용은 PHP 책임 체인 프로그래밍 모델의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.