この記事では、学生が休暇を取るための責任チェーンモードの使用について説明します。次のように、参照のために共有してください。
1。パターン定義
責任チェーンモデルでは、多くのオブジェクトが各オブジェクトによって次の家への参照によって接続され、チェーンが形成されます。チェーン上のオブジェクトがリクエストの処理を決定するまで、クライアントアプリケーション要求はこのチェーンに渡されます。このリクエストを行うクライアントは、チェーン上のどのオブジェクトがリクエストを処理するかを知りません。これにより、システムはクライアントに影響を与えることなく、チェーンを動的に再編成し、責任を割り当てることができます。
(1)要約プロセッサの役割:処理リクエストのインターフェイスを定義します。必要に応じて、インターフェイスは次の家への参照を設定して返す方法を定義できます。この役割は通常、Java抽象クラスまたはJavaインターフェイスによって実装されます。
(2)特定の処理役割:リクエストを受信した後、特定のプロセッサはリクエストを処理するか、リクエストを次の家に合格させることができます。
2。モデルの例
1パターン分析
このモデルを説明するために学生の休暇を借ります
2責任チェーンパターンの静的クラス図
3つのコードの例
3.1学生インターフェイス存在
パッケージcom.demo.chain.message;/** *学生インターフェイス * * @author * */public interface istudent {/** *生徒の状態ステータスを取得 * * * 0:小さなもの(クラスモニターが処理できます) * * 1:クラスモニターは処理できません * * * / ** *学生の休暇メッセージを取得 * * @return */ public string getRequestMessage();}3.2学生は学生を実現します
パッケージcom.demo.chain.message;/** *学生実装クラス * * @author * */public class Student emplements istudent {//条件のサイズprivate int state = -1; //別れメッセージプライベート最終文字列メッセージ。パブリック学生(int state、string message){this.state = state; this.message = message; } / ** *生徒の休暇ステータスを取得 * * 0:小さなこと(クラスモニターが処理できる) } / ** *学生休暇メッセージを取得 * * @return * / public string getRequestMessage(){return this.message; }}3.3要約処理インターフェイス-Ihandler
パッケージcom.demo.chain.handle; import com.demo.chain.message.istudent;/** * abststract processor interface * * @author * */public interface ihandler {//プロセスpublic void handlerequest(istudent desute); //次のハンドラーパブリックボイドSethandler(IHandler Handler)を設定します;}3.4 Abstracthandler
パッケージcom.demo.chain.handle; import com.demo.chain.message.istudent;/** * abststract handler * * @author * * */public abstract class abstracthandlerはihandler {//次のハンドラープライベートihandlerハンドラーを実装します。 // leave level private int state = -1; //コンストラクターの設定レベルパブリックアブストラクハンドラー(int state){this.state = state; } //サブクラスへのリクエストを処理して、特定の処理を処理するパブリックアブストラクトボイドプロセス(ISTUDENT STUDENT)を処理します。 // public void handlerequest(istudent sustent){//学生オブジェクトが存在する場合は、(this.state == student.getState()){//休暇レベルが現在と一致している場合、現在のオブジェクトが処理されます。 } else {if(this.handler!= null){system.out.println( "優れたリーダーに返信を要求!"); //現在のオブジェクトを処理できない場合、this.handler.handlerequest(学生)を処理するために、次のプロセッサに引き渡されます。 }}}}} //次のプロセッサを設定しますpublic public void sethandler(ihandler handler){this.handler = handler; }}3.5 Squad LeaderHandler
パッケージcom.demo.chain.handle; import com.demo.chain.message.istudent;/** * abststract handler * * @author * * */public abstract class abstracthandlerはihandler {//次のハンドラープライベートihandlerハンドラーを実装します。 // leave level private int state = -1; //コンストラクターの設定レベルパブリックアブストラクハンドラー(int state){this.state = state; } //サブクラスへのリクエストを処理して、特定の処理を処理するパブリックアブストラクトボイドプロセス(ISTUDENT STUDENT)を処理します。 // public void handlerequest(istudent sustent){//学生オブジェクトが存在する場合は、(this.state == student.getState()){//休暇レベルが現在と一致している場合、現在のオブジェクトが処理されます。 } else {if(this.handler!= null){system.out.println( "優れたリーダーに返信を要求!"); //現在のオブジェクトを処理できない場合、this.handler.handlerequest(学生)を処理するために、次のプロセッサに引き渡されます。 }}}}} //次のプロセッサを設定しますpublic public void sethandler(ihandler handler){this.handler = handler; }}3.6 Teacher-Teacherhandler
パッケージcom.demo.chain.impl; Import com.demo.chain.handle.abstracthandler; Import com.demo.chain.message.istudent;/** * fature Hander * */public class teacherhandlerがabstracthandler {super(){super(1); } //サブクラス固有の処理リクエスト@Override public void Process(iStudent Student){system.out.println( "教師の返信:" + sustent.getRequestMessage()); }}3.7プリンシパルスクールマスターハンドラー
パッケージcom.demo.chain.impl; Import com.demo.chain.handle.abstracthandler; Import com.demo.chain.message.istudent;/** * kinder * * @author * */public class schoolmasterhandlerがabstracthandlerを拡張します{公開校長(){Super(2); } //サブクラス固有の処理リクエスト@Override public void Process(iStudent Student){system.out.println( "プリンシパルの返信:" + Student.getRequestMessage()); }}3.8外観クラス1プロセスハンドラー
パッケージcom.demo.chain.process; Import com.demo.chain.handle.ihandler; Import com.demo.chain.impl.schoolmasterhandler; Import com.demo.chain.impl.squadleaderhandler; Import com.demo.chain.impl.teacherhandler; intec.demo.demo.demo.demo.chain Chain Association * * @author * */public class processhandler {//クラスリーダーハンドラープライベートファイナルihandler sqmshandler; //教師ハンドラープライベートファイナルIhandler Techhandler; //主要なハンドラープライベートファイナルIhandler scmshandler; // singletonモードprivate static processhandler processhandler = new processhandler(); / *** leave処理の責任チェーンを確立するためのコンストラクターメソッド*/ private processhandler(){//処理オブジェクトの作成// The Teacher this.techhandler = new TeacherHandler(); //校長this.scmshandler = new schoolmasterhandler(); / ***一連の責任を確立する*/ //クラスリーダーの次のハンドラーを設定します。 //教師の次のハンドラーを設定します。 } / ** * singletonオブジェクトインスタンスを取得 * * @return * / public static processhandler getInstance(){return processhandler; } / ** * leave requestを送信 * * @param message * / public void sendmessage(istudent desute){//最初のハンドラーに送信:クラスリーダーはthis.sqmshandler.handlerequest(desute); }}3.9クライアントクライアント
パッケージcom.demo; import java.util.random; import com.demo.chain.message.istudent; import com.demo.chain.message.student; import com.demo.chain.process.processhandler;/** * Main Application * @author */Public Class client {/** * @parim sting */parim st boid */parim sitcs args){//外観オブジェクトProcesshandler processhandler = processhandler.getInstance(); //ランダム数オブジェクトを作成して、学生オブジェクトをランダムに生成してランダム= new Random(); for(int i = 0; i <3; i ++){//ランダム数int radom = random.nextint(3)を取得します; Istudent Student = new Student(radom、 "desute" + i + "私は病気です、休暇を取りたい!"); System.out.println( "###################################################################################################################################################################################################################################################### ############################################################################################################################################## ############################################################################################################################################## ##################################################################################################################################################################################################################################################################」 //メッセージProcessHandler.sendmessage(desute)を処理します。 System.out.println( "############################################# *); }}}4ランニング結果
########################################################################
優れたリーダーから返信をリクエストしてください!
優れたリーダーから返信をリクエストしてください!
校長の返信:学生0は病気で、休暇を取りたいです!
########################################################################
########################################################################
優れたリーダーから返信をリクエストしてください!
優れたリーダーから返信をリクエストしてください!
校長の返信:学生1は病気で、休暇を取りたいです!
########################################################################
########################################################################
承認されたクラスモニター:学生2は病気で、休暇を取りたいです!
########################################################################
iii。このパターンの設計原則
1「オープンクローズ」原則
2単一責任の原則
4.機会を使用します
(1)同じ要求を処理する複数のオブジェクトがあります。どれがそれを処理するために使用されるかはまだ不確かです。オブジェクトがそれを処理するのは、実行時にのみ決定されます。
(2)メッセージには複数の受信者があり、受信オブジェクトは不明です。オブジェクトの1つにメッセージを送信し、内部で処理するだけです。
(3)同じメッセージの複数の処理オブジェクトは動的に増加または減少し、動的に指定する必要があります。
5。責任チェーンパターンの静的クラス図
Java関連のコンテンツについては、このサイトに興味のある読者がトピックを見ることができます。「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作のヒントの要約」、「Javaファイルの要約およびディレクトリ操作のヒント」、「Java Cache操作のヒントの要約」
この記事がみんなのJavaプログラミングに役立つことを願っています。