三國志 責任連鎖モデル

リリース: 2023-08-28 15:16:25
転載
906 人が閲覧しました

皆さん、こんにちは。今日は、設計パターンにおける 責任連鎖モデル について共有します。適切なライフ ストーリーや実際のプロジェクト シナリオを使用してデザイン パターンについて話し、最後にデザイン パターンを一文にまとめます。

ストーリー

2日前、もう一度三国志を読んで、曹操に関羽がいました。英 私の心は漢にあり、劉備が袁紹の所にいて、「五つの峠を越えて六人の将軍を殺す」という行為を行ったと聞きました。

三國志 責任連鎖モデル

関羽は 5 つのレベルをクリアし、6 人の将軍を殺害しました。 主な内容:

  • 最初のレベル、東陵パスし、衛兵将軍孔秀を斬首した。

    東陵峠を守っていた孔秀という将軍は、もともと黄巾賊の一員で、曹操に降伏した後、500 人で東陵峠を守るよう命じられました。関羽の車列が峠を通過したとき、孔秀は通関書類を求めて関羽と衝突し、わずか一回転で関羽に殺された。

  • 第 2 レベルは洛陽峠、蒙潭、漢府です。

    関羽が東陵関を越え、洛陽を越えようとしたとき、韓馗と蒙恬が角で道をふさぎました。まず、孟丹は関羽に戦いを挑みましたが、関羽と仲違いして戦いに負け、孟丹は馬を向きを変えて逃げ、関公を誘って追いかけさせ、韓非が後ろから矢を射て関公を捕らえることができました。しかし、関公の赤兎馬がとても速く、後ろから追いつくことができるとは誰が想像したでしょうか? 孟丹、一撃で孟丹を切り刻みました。韓馗はパニックに陥り矢を放ち、関公の左腕に命中しましたが、関公は矢傷を耐えながら枝角を突き破り、一撃で韓馗を殺し、洛陽を渡りました。

  • #3 番目の峠は、Bian Xi の碧水峠です。

    関羽が峠を越えて配下の将軍たちの首を切り、東陵峠にいる孔秀、韓符、蒙恬が全員殺されたことを知った後、ビアンシーは関公に抵抗するのは難しいと心の中で思った。そこで彼は関公を歓迎するふりをして、正国寺の剣士に関公を殺す機会を待つよう手配した。幸いなことに、鎮国寺の老住職であるプー・ジンが、関公が陰謀に気づいて汪喜と不仲になり、剣で汪喜を殺害したと警告したため、関公は泗水関を通過した。

  • #第 4 レベル、王志。

    この王直は韓甫の親戚で、韓甫が関公に殺されたと聞いて非常に怒り、韓甫に復讐したいと考えました。関公が興陽に到着すると、王直は館内で関公と二人の妻のために宴会を主催した。しかし、胡班は密かに関公に火を放ち、焼き殺そうとした。しかし、関公が父胡華への手紙を持ってきたため、胡班はその秘密を関羽に報告した。関羽と二人の皇妃は事前に宮殿から脱出することができたが、胡班は火を放つふりをして王直を混乱させた。しかし、後に王直がそれを知って胡班を殺害し、関羽を追ってきたが関羽に殺されたため、関公は興陽を通過した。

  • 第 5 レベル、秦斉の黄河を渡るところ。

    この秦斉は夏侯惇のお気に入りの将軍であるだけでなく、老将軍蔡楊の甥でもあり、黄河の渡し船を警備し、通過する船をチェックするよう命じられました。関公が黄河の渡し船に到着したとき、川を渡る船を探していたが、秦斉が引き止め、関公らが川を渡ることを拒否しただけでなく、傲慢な言葉を口にした。最後に関公を怒らせ、関公に斬首されました

これは、関羽が 5 つのレベルを通過し、6 人の将軍を殺害するまでの全過程です。

このストーリーは、責任連鎖パターンという設計パターンを思い出させます。

実際、私たちの生活には責任の連鎖モデルがたくさんあります。例: 基本的にどの企業にも独自の OA システムがあり、主に従業員の基本情報、休暇申請、休暇、払い戻しなどの機能を提供します。何かの用事で 2 日間休暇を取る必要がある場合は、OA システムにログインして休暇の承認を開始します。

会社では休暇の長さについて次の規定があるため:

は半日以内であるため、承認プロセスは次のとおりです: プロジェクト リーダー

半日以上、1 日以下、承認リンク: プロジェクト リーダー テクニカル ディレクター

1 日以上、承認リンク: プロジェクト リーダー テクニカル ディレクター ボス

休暇承認プロセスのヒューマンテクニカルディレクターの上司から、私がプロジェクトの責任者であることがわかります。

責任連鎖の設計パターンとは正確には何ですか?

責任連鎖モデルとは何ですか?

責任連鎖モデルの英語の説明は次のとおりです:

複数のオブジェクトにリクエストを処理する機会を与えることで、リクエストの送信者とその受信者の結合を回避します。受信オブジェクトをチェーン化し、オブジェクトが処理するまでチェーンに沿ってリクエストを渡します。

Chain of Responsibility パターンは、チェーン内の各ノードをオブジェクトとして扱います。各ノードは異なるリクエストを処理し、次のノード オブジェクトは内部で自動的に維持されます。リクエストがチェーンのヘッドエンドから発行されると、そのリクエストは、チェーン内のオブジェクトによって処理されるまで、責任チェーンの事前設定されたパスに沿って各ノード オブジェクトに渡されます。これは、Behavioral Design Pattern に属します。 ###。

責任連鎖モードの一般的なコード

Java は責任連鎖設計パターンを次のように実装します:

public abstract class Handler {
        protected Handler nextHandler = null;
        public abstract void handle();
        public Handler getNextHandler() {
            return nextHandler;
        }
        public void setNextHandler(Handler nextHandler) {
            this.nextHandler = nextHandler;
        }
}

public class HandlerA extends Handler{
        @Override
        public void handle() {
            if(nextHandler == null){
                System.out.println("HandlerA handle ...");
            }else{
                nextHandler.handle();
            }
        }
}

public class HandlerB extends Handler{
        @Override
        public void handle() {
            if(nextHandler == null){
                System.out.println("HandlerB handle ...");
            }else{
                nextHandler.handle();
            }
        }
}

public class HandlerC extends Handler{
    @Override
    public void handle() {
        if(getNextHandler() == null){
            System.out.println("HandlerC handle ...");
        }else{
            getNextHandler().handle();
        }
    }
}
//测试
public class  Client{
    public static void main(String[] args) {
        Handler handlerA = new HandlerA();
        Handler handlerB = new HandlerB();
        handlerA.setNextHandler(handlerB);
        handlerA.handle();
    }
}
ログイン後にコピー

実行結果:

HandlerC handle ...
ログイン後にコピー

上記のコードから、 UML 図を描くことができます:

三國志 責任連鎖モデル


## UML 図から、2 種類の責任があることがわかります。チェーン パターン 非常に重要な役割:

(1)、抽象ハンドラー ロール (Handler)

リクエストを処理するためのインターフェイスを定義します。インターフェイスは、次のオブジェクトへの参照を設定して返すメソッドを提供することもできます。この役割は通常、Java 抽象クラスまたは Java インターフェイスによって実装されます。

(2)、特定のハンドラーの役割 (HandlerA、HandlerB、HandlerC)

リクエストを受信した後、特定のハンドラーはリクエストを処理するか、リクエストを処理するかを選択できます。次のオブジェクトに渡されます。特定のハンドラーは次のホームへの参照を保持しているため。

责任链模式的优缺点

  • 优点:请求和处理分开,两者解耦,提供系统的灵活性。
  • 缺点:性能能问,一个链非常长的时候,非常耗时。因为我们避免建立很长的链。

生活中的案例

在日常生活中,责任链模式是比较常见的。我们平时处理工作中的一些事务,往往是各部门协同合作来完成某一个任务的。而每个部门都有各自的职责,因此,很多时候事情完成一半,便会转交到下一个部门,直到所有部门都审批通过,事情才能完成。

责任链模式主要解耦了请求与处理,客户只需将请求发送到链上即可,不需要关心请求的具体内容和处理细节,请求会自动进行传递,直至有节点对象进行处理。

责任链模式主要适用于以下应用场景:

  • 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交请求。
  • 可动态指定一组对象处理请求。

请假流程的代码实现

下面我们来对,前面的案例:OA上请假流程做一个Java代码的实现。

抽象处理者:领导类

public abstract class Leader {
    private Leader next;
    public void setNext(Leader next) {
        this.next = next;
    }
    public Leader getNext() {
        return next;
    }
    //处理请求的方法
    public abstract void handleRequest(double LeaveDays);
}
ログイン後にコピー

项目负责人

public class ProjectLeader extends Leader {
    @Override
    public void handleRequest(double LeaveDays) {
        if (LeaveDays <= 0.5) {
            System.out.println("项目负责人批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多,没有人批准该假条!");
            }
        }
    }
}
ログイン後にコピー

技术总监

public class TechnicalDirectorLeader extends Leader {

    @Override
    public void handleRequest(double LeaveDays) {
        if (LeaveDays <= 1) {
            System.out.println("技术总监批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多,没有人批准该假条!");
            }
        }
    }
}
ログイン後にコピー

Boss

public class BossLeader extends Leader {
    @Override
    public void handleRequest(double LeaveDays) {
        if (LeaveDays >= 2 && LeaveDays <= 30) {
            System.out.println("Boss批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多,没有人批准该假条!");
            }
        }
    }
}
ログイン後にコピー

发起审批

public class LeaveApproval {
    public static void main(String[] args) {
        //组装责任链
        Leader projectLeader = new ProjectLeader();
        Leader technicalDirectorLeader = new TechnicalDirectorLeader();
        Leader bossLeader = new BossLeader();

        projectLeader.setNext(technicalDirectorLeader);
        technicalDirectorLeader.setNext(bossLeader);

        //请假两天,提交请假流程,开启审批环节,
        projectLeader.handleRequest(2);
    }
}
ログイン後にコピー

审批结果

Boss批准您请假2.0天。
ログイン後にコピー

如果请假天数是31天,审批结果

请假天数太多,没有人批准该假条!
ログイン後にコピー

整个请假流程为:

三國志 責任連鎖モデル


このフローチャートを縦方向に変更します:

三國志 責任連鎖モデル


# このように、責任連鎖モデルを理解するには、上の 2 つの例と 2 つの図を 1 つずつ使用する方が簡単ではないでしょうか。

自分を自慢しても無駄です。マスターが責任連鎖モデルをどのように使用しているかを見てみましょう。

大手企業はこれをどのように使用していますか

Spring や Mybatis などのフレームワークでは、責任連鎖モデルが使用されています。春にどのように使用されるかを見てください。

Spring MVC の

org.springframework.web.servlet.DispatcherServlet クラス内:

三國志 責任連鎖モデル


getHandler 方法的处理使用到了责任链模式,handlerMappings是之前 Spring 容器初始化好的,通过遍历 handlerMappings查找与request匹配的 Handler, 这里返回 HandlerExecutionChain 对象。这个 HandlerExecutionChain对象到后面执行的时候再分析为什么返回的是这样一个对象。

@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
 if (this.handlerMappings != null) {
  for (HandlerMapping mapping : this.handlerMappings) {
   HandlerExecutionChain handler = mapping.getHandler(request);
   if (handler != null) {
    return handler;
   }
  }
 }
 return null;
}
ログイン後にコピー

以上便是责任链模式在Spring的具体使用

总结

本文通过关二爷的过五关斩六将和OA系统中的请假审批流程,完美的解释了责任链设计模式。

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

関連ラベル:
ソース:Java后端技术全栈
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!