ホームページ Java &#&チュートリアル Java 設計パターンにおける責任連鎖パターンの分析例

Java 設計パターンにおける責任連鎖パターンの分析例

Aug 10, 2017 pm 01:27 PM
java 事例分析 デザインパターン

この記事では、主にデザインパターンの責任接続パターンの関連情報を詳しく紹介します。興味のある方は参考にしてください。

定義: 複数のオブジェクトがリクエストを処理できるようにします。リクエストの送信者と受信者の間の結合関係を回避します。これらのオブジェクトはチェーンに接続され、リクエストはオブジェクトが処理するまでチェーンに沿って渡されます。

タイプ: 動作クラスパターン

クラス図:

最初にコードの一部を見てみましょう:


public void test(int i, Request request){ 
 if(i==1){ 
  Handler1.response(request); 
 }else if(i == 2){ 
  Handler2.response(request); 
 }else if(i == 3){ 
  Handler3.response(request); 
 }else if(i == 4){ 
  Handler4.response(request); 
 }else{ 
  Handler5.response(request); 
 } 
}
ログイン後にコピー

このメソッドには 2 つのパラメーターがあります。整数 i と an リクエストの場合、i の値によって、誰がリクエストを処理するかが決まります。i==1 の場合は Handler1 によって処理され、i==2 の場合は Handler2 によって処理されます。プログラミングでは、このビジネス処理方法は非常に一般的であり、リクエストを処理するすべてのクラスには、リクエストを処理するための一連の責任を形成するために接続された if...else... 条件判断ステートメントが含まれています。この方法の利点は、非常に直感的で、シンプルかつ明確で、保守が比較的容易であることです。しかし、この方法にはいくつかの厄介な問題もあります。

コードが肥大化する: 1 か 2 かを判断するのはそれほど単純ではありません。複雑な計算やデータベースへのクエリなどが必要になる場合があり、さらに多くの判断条件がある場合は、この if になります。 ..else... ステートメントは基本的にもう見ることができません。
高度な結合: リクエストを処理するためのクラスを追加し続けたい場合は、さらに else if 判定条件を追加し続ける必要があり、この条件判定の順序もハードコーディングされます。順序を変更したい場合は、この条件文を変更するだけです。

欠点が明らかになったので、それらを解決する方法を見つけなければなりません。このシナリオのビジネス ロジックは非常に単純です。条件 1 が満たされている場合は Handler1 によって処理され、条件 2 が満たされていない場合は Handler2 によって処理されます。 、条件が終了するまで、引き続き引き継がれます。実は改善方法も非常にシンプルで、判定条件部分を処理クラスに組み込むというもので、これが責任連鎖モデルの原理です。

責任連鎖パターンの構造

責任連鎖パターンのクラス図は、抽象処理クラスとその実装クラスのセットで構成されています:

抽象処理クラス。 : 概要 処理クラスには主に、次の処理クラスを指すメンバー変数 nextHandler と、リクエストを処理するためのメソッド handRequest が含まれています。 handRequest メソッドの主な考え方は、処理条件が満たされた場合に、この処理クラスが次の処理を実行するということです。それを処理しない場合は、nextHandler が処理します。

特定の処理クラス: 特定の処理クラスは、主に特定の処理ロジックと処理に適用される条件を実装します。模 責任とパターンの一般的な考え方を理解した後、コードを理解することをお勧めします。


R

class Level { 
  private int level = 0; 
  public Level(int level){ 
    this.level = level; 
  }; 
   
  public boolean above(Level level){ 
   if(this.level >= level.level){ 
      return true; 
    } 
    return false; 
  } 
} 
 
class Request { 
  Level level; 
  public Request(Level level){ 
    this.level = level; 
  } 
   
  public Level getLevel(){ 
    return level; 
  } 
} 
 
class Response { 
 
} 

abstract class Handler { 
  private Handler nextHandler;   
  public final Response handleRequest(Request request){ 
    Response response = null; 
     
   if(this.getHandlerLevel().above(request.getLevel())){ 
      response = this.response(request); 
    }else{ 
      if(this.nextHandler != null){ 
        this.nextHandler.handleRequest(request); 
      }else{ 
        System.out.println("-----没有合适的处理器-----"); 
      } 
    } 
    return response; 
  } 
  public void setNextHandler(Handler handler){ 
   this.nextHandler = handler; 
  } 
  protected abstract Level getHandlerLevel(); 
   public abstract Response response(Request request); 
} 
 
class ConcreteHandler1 extends Handler { 
  protected Level getHandlerLevel() { 
    return new Level(1); 
  } 
  public Response response(Request request) { 
    System.out.println("-----请求由处理器1进行处理-----"); 
    return null; 
  } 
} 
 
class ConcreteHandler2 extends Handler { 
  protected Level getHandlerLevel() { 
    return new Level(3); 
  } 
  public Response response(Request request) { 
    System.out.println("-----请求由处理器2进行处理-----"); 
    return null; 
  } 
} 
 
class ConcreteHandler3 extends Handler { 
  protected Level getHandlerLevel() { 
    return new Level(5); 
  } 
  public Response response(Request request) { 
    System.out.println("-----请求由处理器3进行处理-----"); 
    return null; 
  } 
} 
 
public class Client { 
  public static void main(String[] args){ 
    Handler handler1 = new ConcreteHandler1(); 
    Handler handler2 = new ConcreteHandler2(); 
    Handler handler3 = new ConcreteHandler3(); 
 
    handler1.setNextHandler(handler2); 
    handler2.setNextHandler(handler3); 
     
    Response response = handler1.handleRequest(new Request(new Level(4))); 
  } 
}
ログイン後にコピー

コード内のレベル クラスは、Request、Response がそれぞれリクエストとレスポンスに対応します。 ; 抽象クラス Handler の主な目的は、処理レベルがリクエストのレベルよりも高い場合のみ処理可能であり、それ以外の場合は次の処理クラスに引き継がれます。プロセッサー。 Client クラスでチェーンの実行前と実行後の関係を設定し、実行中に最初の処理クラスにリクエストを渡します。これが完了する関数は if...else... ステートメントと同じです。前の記事で。


責任連鎖パターンのメリットとデメリット


責任連鎖パターンは、if...else...と比較して、条件判定をさまざまな処理クラスに分散させるため結合度が低く、これらの処理クラスの順序が異なります。優先順位は任意に設定できます。責任連鎖モデルにも、if...else... ステートメントの欠点と同じ欠点があります。つまり、責任連鎖が見つかると、正しい処理クラスが見つかる前にすべての判断条件が実行される必要があります。比較的長い場合、パフォーマンスの問題はより深刻です。責任連鎖モードの応用


冒頭の例のように、責任連鎖を整理するために if ... else ... ステートメントを使用すると、コードの見た目が悪くなると、無力に感じてしまいます。リファクタリングを使用するために使用する責任チェーン モード。

概要


責任連鎖モードは、実際には if ... else ... ステートメントの柔軟なバージョンであり、これらの判断条件をさまざまな処理カテゴリに分類するものであり、クラスのコンテキストを扱うときは、正確に決定するように特に注意する必要があります。クラスの処理前後のロジック間の条件関係を確認し、チェーン内で循環参照が発生しないように注意してください。

以上がJava 設計パターンにおける責任連鎖パターンの分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

See all articles