【Javaデザインパターン】Javaデザインパターン(5)Chain of Responsibility Pattern(Chain of Responsibility Pattern)

この記事の内容

1. Chain ofResponsibilityモデルの概要

2、コードの実装

2.1ビジネスロジック

2.2コードの実装


名前が示すように、Chain of Responsibility Patternは、リクエストの受信者オブジェクトのチェーンを作成します。このモードは、リクエストのタイプを提供し、リクエストの送信者と受信者を切り離します。このタイプのデザインパターンは行動パターンです。

このモデルでは、通常、各受信者には別の受信者への参照が含まれています。オブジェクトがリクエストを処理できない場合、同じリクエストを次の受信者に渡します。

1. Chain ofResponsibilityモデルの概要

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

主な解決策:責任チェーンの処理者がリクエストの処理を担当し、顧客はリクエストを責任チェーンに送信するだけでよく、リクエストの処理の詳細やリクエストの転送について気にする必要はありません。 、したがって、責任チェーンはリクエストの送信者とリクエストの処理者になります。

使用する場合:メッセージを処理するときに多くのチャネルをフィルタリングします。

解決方法:インターセプトされたすべてのクラスは、統一されたインターフェースを実装します。

キーコード:ハンドラーはそれ自体を集約し、HandlerRequestで適切かどうかを判断し、条件が満たされない場合はそれを渡し、誰に渡す前にそれを設定します。

応用例:1。紅楼夢の「花を渡すための太鼓」。2.JSでバブリングするイベント。3. JAVAWEBでのApacheTomcatによるエンコーディングの処理、Struts2のインターセプター、およびjspサーブレットのフィルター。

利点:1。結合度を減らします。リクエストの送信者と受信者を切り離します。2.オブジェクトを単純化します。そのため、オブジェクトはチェーンの構造を知る必要がありません。3.オブジェクトに責任を割り当てる柔軟性を強化します。チェーンのメンバーを変更したり、順序を動員したりすることで、責任を動的に追加または削除できます。4.新しいリクエスト処理クラスを追加すると非常に便利です。

短所:1。リクエストが受け入れられる保証はありません。2.システムのパフォーマンスはある程度影響を受け、コードのデバッグは不便であり、ループ呼び出しが発生する可能性があります。3.実行時に特性を観察するのは簡単ではなく、デバッグの妨げになる場合があります。

使用シナリオ:1。同じリクエストを処理できるオブジェクトが複数あり、リクエストを処理するオブジェクトは実行時に自動的に決定されます。2.受信者を明確に指定せずに、複数のオブジェクトの1つにリクエストを送信します。3.オブジェクトのグループを動的に指定して、要求を処理できます。

注:JAVAWEBには多くのアプリケーションがあります。

2、コードの実装

すべてのデザインパターンのコード実装例は、Code Cloudで表示できます。興味がある場合は、確認できます。CodeCloudアドレス:https//gitee.com/no8g/java-design-patterns

2.1ビジネスロジック

古代中国では、「三従四徳」の倫理が女性のために策定されました。「三従四徳」とは、「結婚していない場合は父親に従い、結婚している場合は夫に従い、夫が死亡した場合は息子に従う」ことを指します。つまり、女性は結婚していないときは父に従い、結婚した後は夫に従い、夫が亡くなったときでも息子に従わなければなりません。たとえば、買い物に出かけたい女性も同様の要望で、結婚前に父親の同意を得、結婚後に夫の許可を得る必要があります。夫が亡くなった場合はどうなりますか?一般的に、男性は女性よりも早く亡くなり、息子に買い物に行くことを許可するかどうかを尋ねる必要があります。息子がいない場合は、すぐにどうするかを尋ねると思います。義兄や甥などに聞いてみてください。父系社会では、女性は従属的な地位しか占めていません。今、中国の女性について考えると、それはまだ比較的悲惨です。買い物に行くときは指示を求める必要があります。父親、夫、息子の2つの選択肢しかありません。責任。買い物に行くことを許可するかしないか、または次の人に尋ねるように彼女に言う、これは社会システム全体の制約です。

私たちのプロジェクトに適用されるのはビジネスルールです。次に、プログラムを通じて「3つのコンプライアンス」を実装する方法を見てみましょう。要件は非常に単純です。プログラムを通じて古代の女性の「3つのコンプライアンス」システムを説明するので、最初にクラス図を見てみましょう。 :

このような構造に抽象化すると、女性のリクエストが最初に父親のクラスに送信され、父親のクラスはそれを自分で処理する必要があることを確認し、それに応答します。娘がすでに結婚している場合、リクエストは次のようになります。処理のために義理の息子に転送されます。義理の息子が報告するために天国に行くと、息子はこの要求と同様に要求を処理します。

父、夫、息子の各ノードには2つの選択肢があります。責任を取って応答するか、要求を後続のリンクに転送するかです。構造解析はすでに非常に明確です。次に、この関数を実装する方法を見てみましょう。最初にクラス図を見てください。

クラス図から、Father、Husband、Sonの3つの実装クラスは、コンストラクターと親クラスの抽象メソッドを実装するだけで済みます。これらのリクエストの処理方法は、Hanlder抽象クラスに転送されました。Hanlderがどのように達成するかを見てみましょう。

結果も正しく、ビジネスコールクラスClientは、誰が処理する必要があるかを判断する必要がなく、Handler抽象クラスのサブクラスは今後も追加できますが、配信チェーンが増加し、呼び出しクラスが増加します。変更プロセスを理解する必要はありません。また、誰がこのリクエストを処理しているかを知る必要もありません。

上記の説明は責任連鎖モデルです。女性のリクエストを処理するときに、父親、夫、息子の3つのカテゴリが渡されているかどうかを確認します。各リンクには、責任を取って応答するか、渡すかの2つのオプションしかありません。リクエスト、最終的に応答するリンクがあります。一般的なクラス図は次のとおりです。

2.2コードの実装

package com.iot.practice.designpattern.chainofresponsibility.chainofresponsibilitypattern;

import com.iot.practice.designpattern.chainofresponsibility.IWomen;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * <p>Client 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 11:37</p>
 * <p>@remark:</p>
 */
public class ChainOfResponsibilityClient {

    public static void main(String[] args) {
        // 随机挑选几个女性
        Random random = new Random();
        List<IWomen> iWomenList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            iWomenList.add(new IWomenImpl(random.nextInt(4), "我要看电影"));
        }

        // 定义三个请示对象
        Handler father = new Father();
        Handler husband = new Husband();
        Handler son = new Son();

        // 设置请示顺序
        father.setNext(husband);
        husband.setNext(son);

        for (IWomen iWomen : iWomenList) {
            father.HandleMessage(iWomen);
        }
    }
}

 

package com.iot.practice.designpattern.chainofresponsibility.chainofresponsibilitypattern;

import com.iot.practice.designpattern.chainofresponsibility.IWomen;

/**
 * <p>Handler 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 10:56</p>
 * <p>@remark:
 * 有没有看到,其实在这里也用到模版方法模式,在模版方法中判断请求的级别和当前能够处理的级别,
 * 如果相同则调用基本方法,做出反馈;如果不相等,则传递到下一个环节,由下一环节做出回应。基本方
 * 法 response 要各个实现类都要实现,我们来看三个实现类:
 * </p>
 */
public abstract class Handler {

    /**
     * 能处理的级别
     */
    private int level = 0;

    /**
     * 责任传递,下一个人责任人是谁
     */
    private Handler nextHandler;

    /**
     * 构造函数:每个类都要说明一下自己能处理哪些请求
     *
     * @param level 能处理的级别
     */
    public Handler(int level) {
        this.level = level;
    }

    /**
     * 一个女性(女儿,妻子或者是母亲)要求逛街,你要处理这个请求
     *
     * @param iWomen 女性统称
     */
    public final void HandleMessage(IWomen iWomen) {
        if (iWomen.getType() == this.level) {
            this.response(iWomen);
        } else {
            // 有后续环节,才把请求往后递送
            if (this.nextHandler != null) {
                this.nextHandler.HandleMessage(iWomen);
            } else {
                // /已经没有后续处理人了,不用处理了
                System.out.println("-----------没地方请示了,不做处理!---------\n");
            }
        }
    }

    /**
     * 如果不属于你处理的返回,你应该让她找下一个环节的人,比如
     * 女儿出嫁了,还向父亲请示是否可以逛街,那父亲就应该告诉女儿,应该找丈夫请示
     *
     * @param handler 处理类
     */
    public void setNext(Handler handler) {
        this.nextHandler = handler;
    }

    /**
     * 有请示那当然要回应
     *
     * @param iWomen 女性统称
     */
    public abstract void response(IWomen iWomen);
}
package com.iot.practice.designpattern.chainofresponsibility;

/**
 * <p>IWomen 此接口用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 9:55</p>
 * <p>@remark:古代悲哀女性的总称</p>
 */
public interface IWomen {

    /**
     * 获得个人状况
     *
     * @return 个人状况数值
     */
    public int getType();

    /**
     * 获得个人请示,你要干什么?出去逛街?约会?还是看电影
     *
     * @return 干什么
     */
    public String getRequest();
}
package com.iot.practice.designpattern.chainofresponsibility.chainofresponsibilitypattern;

import com.iot.practice.designpattern.chainofresponsibility.IWomen;

/**
 * <p>IWomenImpl 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 11:23</p>
 * <p>@remark:</p>
 */
public class IWomenImpl implements IWomen {

    /**
     * 通过一个int类型的参数来描述妇女的个人状况
     * 1---未出嫁
     * 2---出嫁
     * 3---夫死
     */
    private int type = 0;

    /**
     * 妇女的请示
     */
    private String request = "";

    /**
     * 构造函数传递过来请求
     *
     * @param type    个人状况
     * @param request 妇女的请示
     */
    public IWomenImpl(int type, String request) {
        this.type = type;
        this.request = request;
        // 为了显示好看点,我在这里做了点处理
        switch(this.type) {
            case 1:
                this.request = "女儿的请求是:" + request;
                break;
            case 2:
                this.request = "妻子的请求是:" + request;
                break;
            case 3:
                this.request = "母亲的请求是:" + request;
                break;
        }
    }

    /**
     * 获得自己的状况
     *
     * @return 自己的状况
     */
    @Override
    public int getType() {
        return this.type;
    }

    /**
     * 获得妇女的请求
     *
     * @return 妇女的请求
     */
    @Override
    public String getRequest() {
        return this.request;
    }
}
package com.iot.practice.designpattern.chainofresponsibility.chainofresponsibilitypattern;

import com.iot.practice.designpattern.chainofresponsibility.IWomen;

/**
 * <p>Father 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 11:13</p>
 * <p>@remark:</p>
 */
public class Father extends Handler {

    /**
     * 父亲只处理女儿的请求
     */
    public Father() {
        super(1);
    }

    /**
     * 父亲的答复
     *
     * @param iWomen 女性统称
     */
    @Override
    public void response(IWomen iWomen) {
        System.out.println("--------女儿向父亲请示-------");
        System.out.println(iWomen.getRequest());
        System.out.println("父亲的答复是:同意\n");
    }
}
package com.iot.practice.designpattern.chainofresponsibility.chainofresponsibilitypattern;

import com.iot.practice.designpattern.chainofresponsibility.IWomen;

/**
 * <p>Husband 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 11:15</p>
 * <p>@remark:</p>
 */
public class Husband extends Handler {

    /**
     * 丈夫只处理妻子的请求
     */
    public Husband() {
        super(2);
    }

    /**
     * 丈夫的答复
     *
     * @param iWomen 女性统称
     */
    @Override
    public void response(IWomen iWomen) {
        System.out.println("--------妻子向丈夫请示-------");
        System.out.println(iWomen.getRequest());
        System.out.println("丈夫的答复是:同意\n");
    }
}
package com.iot.practice.designpattern.chainofresponsibility.chainofresponsibilitypattern;

import com.iot.practice.designpattern.chainofresponsibility.IWomen;

/**
 * <p>Son 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月19日 11:18</p>
 * <p>@remark:</p>
 */
public class Son extends Handler {

    /**
     * 儿子只处理母亲的请求
     */
    public Son() {
        super(3);
    }

    /**
     * 儿子的答复
     *
     * @param iWomen 女性统称
     */
    @Override
    public void response(IWomen iWomen) {
        System.out.println("--------母亲向儿子请示-------");
        System.out.println(iWomen.getRequest());
        System.out.println("儿子的答复是:同意\n");
    }
}

 

 

 

終わり!

 

おすすめ

転載: blog.csdn.net/weixin_44299027/article/details/113885752