ホームページ > バックエンド開発 > PHPチュートリアル > PHP 責任連鎖プログラミング モデル

PHP 責任連鎖プログラミング モデル

*文
リリース: 2023-03-18 16:32:01
オリジナル
1426 人が閲覧しました

この記事では、主に PHP の責任連鎖プログラミング モデルを紹介します。これは、開発チームによって広く使用されているプログラミング規約でもあります。お役に立てれば幸いです。

概要
責任連鎖パターンは、オブジェクトの動作パターンです。責任の連鎖パターンでは、多くのオブジェクトがその下位オブジェクトへの各オブジェクトの参照によって接続され、連鎖を形成します。リクエストは、チェーン内のオブジェクトがリクエストの処理を決定するまで、チェーンを上流に渡されます。リクエストを行ったクライアントは、チェーン内のどのオブジェクトが最終的にリクエストを処理するかを知りません。これにより、システムはクライアントに影響を与えることなく、責任を動的に再編成して割り当てることができます


責任のチェーンパターンの定義
複数のオブジェクトを与えるオブジェクトにリクエストを処理する機会を与え、それによってリクエストの送信者と受信者の間の結合関係を回避し、これらのオブジェクトをチェーンに接続し、オブジェクトが処理するまでこのチェーンに沿ってリクエストを渡します。

責任連鎖モデルの利点
最も重要な利点は、リクエストと処理が分離されることです。リクエスタは誰がリクエストを処理しているかを知る必要がなく、プロセッサもリクエスト全体を知る必要がありません。この 2 つは分離されているため、システムの柔軟性が向上します。

責任連鎖モデルの欠点
まず、各リクエストはチェーンの先頭から最後までたどられます。特にチェーンが比較的長い場合、パフォーマンスが問題になります。第 2 に、特にチェーンが比較的長く、多くのリンクがある場合、デバッグはあまり便利ではありません。同様の再帰的な方法により、デバッグ中のロジックがより複雑になる可能性があります。


責任連鎖モデルに関わる役割は以下のとおりです:

抽象ハンドラー(Handler)役割:リクエストを処理するためのインターフェースを定義します。必要に応じて、インターフェイスは次のインターフェイスへの参照を設定して返すメソッドを定義できます。このロールは通常、PHP 抽象クラスまたはインターフェイスによって実装されます。上図の Handler クラスの集約関係は、特定のサブクラスの参照を次のホームに与えます。抽象メソッド handleRequest() は、リクエストを処理するためのサブクラスの操作を標準化します。 特定のハンドラー (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(); 
  ?>
ログイン後にコピー

コードから次のことがわかります。クライアント 2 つのハンドラー オブジェクトが作成され、最初のハンドラー オブジェクトの次のハンドラー オブジェクトが 2 番目のハンドラー オブジェクトとして指定されていますが、2 番目のハンドラー オブジェクトには次のハンドラーがありません。次に、クライアントはリクエストを最初のハンドラー オブジェクトに渡します


関連する推奨事項:

PHP シングルトン パターンの実装

php ファクトリ メソッド パターン

以上がPHP 責任連鎖プログラミング モデルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート