みなさんこんにちは、Lao Tianです。今日からこの公式アカウントで毎週特典をプレゼントします。何をあげたらいいですか?専門的な書籍である必要がありますが、追加機能はそれほど多くありません。参加方法については記事の最後を参照してください。
さて、本題に入りましょう。今日は、デザイン パターンの Delegation パターン について共有します。適切なライフ ストーリーや実際のプロジェクト シナリオを使用してデザイン パターンについて話し、最後にデザイン パターンを一文にまとめます。
文字通りの意味では、「委任」とは委託の取り決め、つまり代表団の派遣を指します。
私たちの技術分野には委任モデルとも呼ばれるモデルがありますが、委任モデルは GOF の 23 のモデルには属しません。ただし、その性質と役割により、誰もが委任モデルを行動モデル。

楚漢伝説で、劉邦が韓信を将軍にしたとき、以下の多くの人々がとても不満でした。不満の理由は非常に単純で、韓信は多くの軍事プロジェクトを確立しておらず、チーム内での威信もありません。しかし、彼は「私は王の命令に従うだけです。私の命令に従う将軍は10人だけです。」と単刀直入に言いました。

劉邦は韓信に命令を出し、韓信も将軍の専門性に基づいて対応する命令を出した。 。
委任パターン: 英語の委任パターン。その基本機能は、タスクのスケジュール設定と割り当てを担当することです。タスクの
ここで、委任モードはプロキシ モードと非常によく似ていることに注意してください。委任モードは、特殊な場合には静的プロキシの全権限と見なすことができます。
エージェント モード: プロセスに重点が置かれます。委任モデル: 焦点は結果にあります。
会社では、上司がプロジェクト マネージャーにタスクを割り当てますが、プロジェクト マネージャー自身が仕事を割り当てます。やり方がわからない これらのタスクは作業を行うのではなく、担当するモジュールに応じて対応する開発仲間に引き継がれ、全員がタスク完了の結果をプロジェクトマネージャーに報告し、最後にプロジェクトマネージャーが結果をまとめる上司に。
これは、委任モードの非常に典型的なアプリケーション シナリオです。
画像を使用して次のことを表します:

//开发的同事进行抽象
public interface IEmployee {
void doing(String command);
}
//下面假设有三哥员工
public class EmployeeA implements IEmployee{
@Override
public void doing(String command) {
System.out.println("我是员工A,擅长做数据库设计,现在开始做" + command);
}
}
public class EmployeeB implements IEmployee {
@Override
public void doing(String command) {
System.out.println("我是员工B,擅长做架构,现在开始做" + command);
}
}
public class EmployeeC implements IEmployee {
@Override
public void doing(String command) {
System.out.println("我是员工C,擅长做业务,现在开始做" + command);
}
}import java.util.HashMap;
import java.util.Map;
public class Leader {
private Map<String, IEmployee> employeeMap = new HashMap<>();
//既然是项目经历,那他心里,肯定知道每个开发同事擅长的领域是什么
public Leader() {
employeeMap.put("数据库设计", new EmployeeA());
employeeMap.put("架构设计", new EmployeeB());
employeeMap.put("业务代码", new EmployeeC());
}
//leader接收到老板Boss的任务命令后
public void doing(String command) {
//项目经理通过任务命令,找到对应的开发同事,
// 然后把对应任务明给这位同事,这位同事就可以去干活了
employeeMap.get(command).doing(command);
}
}public class Boss {
//Boss也得根据每个项目经理锁负责的领域进行任务分配
public void command(String command, Leader leader) {
leader.doing(command);
}
}public class DelegateDemoTest {
public static void main(String[] args) {
new Boss().command("架构设计", new Leader());
}
}我是员工B,擅长做架构,现在开始做架构设计
在Spring MVC中有个大姐耳熟能详的DispatcherServlet ,下面请看DispatcherServlet 在整个流程中的角色:
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
//转发、分派
doDispatch(request, response);
}
/**
* Process the actual dispatching to the handler.
* 处理实际分派给处理程序
* <p>The handler will be obtained by applying the servlet's HandlerMappings in order.
* The HandlerAdapter will be obtained by querying the servlet's installed HandlerAdapters
* to find the first that supports the handler class.
* <p>All HTTP methods are handled by this method. It's up to HandlerAdapters or handlers
* themselves to decide which methods are acceptable.
* @param request current HTTP request
* @param response current HTTP response
* @throws Exception in case of any kind of processing failure
*/
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
...
}这里只能点到为止,因为涉及到很多东西,尤其是HandlerAdapters、HandlerMapping不是一时半会能讲完的。
另外, 在一些框架源码中,比如Spring等,命名以Delegate结尾,比如:BeanDefinitionParserDelegate(根据不同的类型委派不同的逻辑解析BeanDefinition),或者是以Dispacher开头和结尾或开头的,比如:DispacherServlet一般都使用了委派模式。
わかりました。委任モデルについては以上です。もうわかりましたか?
最後に、委任モデルを 1 つの文で要約します。
要件は非常に単純ですが、気にしません
以上が韓信が将軍になる: 代表モードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。