デザインパターンの委任パターンについて話しましょう

コードファーマーは彼の道を進んでいます

誰もが機会、機会、選択について話しているが、風に会い、機会をつかむことができるためには、選択をするための前提は、あなたがこの能力を持っている必要があるということです。何もしなければ、成功は数え切れないほどの試み、努力、失敗を経ることになります。これらを経験して初めて、トレンドを判断し、チャンスをつかむ能力を持ち、選択肢を区別することを考えることができます。あなたが大砲の飼料になる確率。たぶん、あなたが今日していることは、あなたがすべて役に立たないように見えても、他の人に見られますが、そうではありません。それは驚くべき力で爆発します。来て!サンニアン

序文

実生活では、代表団という言葉がいたるところに見られます。たとえば、高校を卒業したとき、チェーンブライダルショップでセールスマンとして働いていました。先日、チラシを配ったり、結婚式の写真を撮ってくれる人を探しに出かけたりしました。 。数日後、女性の副司令官は、上司がデータを整理するように手配し、それを行うための従業員を見つける必要があると私に言いました。彼女は私がかわいいと思ったので、私にそれをするように頼みました。明らかに、彼女は自分でやりたくなかったので、私にやりたいと頼みました。軒下では、どうして誰も頭を下げられなかったので、涙を流して整理しましたが、しばらくするとできませんでした。雰囲気に立っているので、一晩バケツを持って逃げました。

この経験から、さまざまなレベルの人の間に委託の層があり、最終的には下位レベルの人に委ねられていることがわかります。その後、仕事に参加するときに上司から委託されることがよくあります。

委任モードコーディングの実装

コードを使用して、リーダーと従業員の間でタスクの委任を実装します。上司はタスクを手配します。部門マネージャーは注文を受け取った後、対応する従業員に作業を委任します。

タスクインターフェイス

タスクインターフェイスを定義し、メソッドを定義dispatch()し、特定の従業員がそれを実装します。

/**
 * @author 刘牌
 * @date 2022/3/12 2:18
 */
public interface ITask {
    void dispatch(String task);
}
复制代码

部門マネージャー委任クラス

部門長は委任者であり、その機能は文字を分類して対応する従業員に配布することです。彼はマップ構造を使用してそれらを格納します。キーはタスク名であり、値は特定の実装者(従業員)です。渡されたキーを介して対応する実装者を取得し、対応する実装メソッドを呼び出します。

/**
 * @author 刘牌
 * @date 2022/3/12 2:22
 */
public class DeptLeader implements ITask {
    private final Map<String, ITask> staffTaskMap = new HashMap<>();

    public DeptLeader() {
        staffTaskMap.put("整理资料",new StaffLiu());
        staffTaskMap.put("收集资料",new StaffZhang());
        staffTaskMap.put("传送资料",new StaffLi());
    }

    @Override
    public void dispatch(String task) {
        if (staffTaskMap.containsKey(task)) staffTaskMap.get(task).dispatch(task);
    }
}
复制代码

従業員固有のタスククラス

従業員は特定のタスクを実行します。3人の従業員が作業を委託されます。従業員の劉は情報を整理し、従業員の張は携帯電話の情報を送信し、従業員の李は情報を送信します。彼らがしなければならないことは彼ら次第ではありません。それは絶対に部門次第です。リーダー。実際には、上司から整理を依頼された場合データを整理したくないと言った場合は、フロアを一掃したいので、しばらくここにいる必要があります。

/**
 * @author 刘牌
 * @date 2022-04-0622:37
 */
public class StaffLi implements ITask{
    @Override
    public void dispatch(String task) {
        System.out.println("员工李被委派:"+task);
    }
}

public class StaffLiu implements ITask {
    @Override
    public void dispatch(String task) {
        System.out.println("员工刘被委派:"+task);
    }
}

public class StaffZhang implements ITask {
    @Override
    public void dispatch(String task) {
        System.out.println("员工张被委派:"+task);
    }
}
复制代码

上司はコマンドを発行します

上司はデータを整理するために注文を発行し、注文は最初に部門マネージャーに発行され、次に部門マネージャーが特定の従業員に発行されます。

/**
 * @author 刘牌
 * @date 2022/3/12 2:28
 */
public class BossClient {
    public static void main(String[] args) {
        DeptLeader deptLeader = new DeptLeader();
        deptLeader.dispatch("整理资料");
    }
}
复制代码

出力

员工刘被委派:整理资料
复制代码

到这里,一个简单委派模式的例子就完成了,比较简单。

思考

从上面的例子中我们发现委派是不是核代理模式很像,代理模式的思想就是自己不做具体的任务,让别人去做,委派模式也是一样,自己不做具体的任务, 而是委派给其他人来做,区别在于,在委派者这里,它由多种策略组成,根据不同的指令,选择不同的策略,所以,委派模式也是策略模式的思想,那么 综合一个,委派模式就是代理模式和策略模式的组合。

使用场景

那么我们在哪里使用委派模式呢?如果我们的系统中有很多类,它们的定义一样,都是相同的架子,只是处理方式不一样,需要根据不同的请求来调用不同 的类,那么可以选择委派模式,委派模式也能够很好的解耦系统代码,因为具体的任务让具体的类去实现,不用集中处理,当新增加任务,只需要增加相应 的实现类即可。

在一些开源框架和JDK中,也用到了委派模式,JDK双亲委派机制就是委派模式的思想,我们知道知道,JDK中加载一个类,会使用ClassLoader进行加载, 分为三个类加载器,启动类加载器Bootstrap ClassLoader,扩展类加载器Extension ClassLoader,应用程序类加载器Application ClassLoader 当我们加载一个类的时候,首先先去启动类加载器bootstrap找,如果有就直接用,如果没有就去扩展类加载器找,如果扩展类加载器没有,就去应用程序加载器找,如果还是没有,就报ClassNotFoundException异常。在SpringMVC中也是使用了委派模式,后面说SpringMVC的时候会详细说到。

今天的分享就到这里,感谢你的观看,我是小四,我们下期见。

おすすめ

転載: juejin.im/post/7083520892277358623