首頁  >  文章  >  Java  >  韓信拜將:委派模式

韓信拜將:委派模式

Java后端技术全栈
Java后端技术全栈轉載
2023-08-25 15:55:301286瀏覽

大家好,我是老田,從今天開始,本公眾號每週給大家送福利,送什麼呢?肯定是技術書啦,沒那麼多花俏的,參與方式見文末。

好啦,進入我們的主題,今天我要跟大家分享設計模式中的委派模式。用貼切的生活故事,以及真實專案場景來講設計模式,最後用一句話來總結這個設計模式。

故事

從字面上來看,委派:指委託安排;委任派遣 。

在我們技術領域有個模式也叫委派模式,但委派模式不屬於GOF的23種模式,但由於其性質和作用,大家都把委派模式歸納在行為模式中。

韓信拜將:委派模式


在楚漢傳奇中,劉邦當時封韓信為大將軍時,下面很多人非常不服。不服的理由很簡單,就是韓信沒立過多少軍工,在戰隊裡沒有威望。然而他直說了一句:「我只聽大王的命令,我只要10個聽我命令的將軍」。

韓信拜將:委派模式


劉邦下達指令給韓信,韓信根據將軍們的特長,下達對應指令。

委派模式的定義

#委派模式:英文Delegate Pattern,它的基本功能就是負責任務的排程與分配任務。

在這裡要注意,委派模式和代理模式非常相似,可以把委派模式看作為一種特殊情況下的靜態代理的全權代理。

代理模式:重點在於過程。委派模式:重點在於結果。

生活案列

#公司內,老闆把任務下發給專案經理,專案經理自己不會去幹活,而是把這些任務按照每個人負責的模組,交給對應的開發同事們去開發,大家把任務完成結果告訴專案經理,最後專案經理把結果匯總給老闆。

這邊是一個非常典型的委派模式的應用場景。

用一張圖表示:

韓信拜將:委派模式


#程式碼實作

#開發同事很多,但是有個統一的屬性,那就是碼代碼:

//开发的同事进行抽象
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);
    }
}

員工有了,那我們就來定義專案經理Leader。

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);
    }
}

有了開發同事、專案經理,那還得有Boss。

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,擅长做架构,现在开始做架构设计

這樣我們就把一個生活中委派模式的案例,使用程式碼實現了。簡單否?

在上面的案例中,有三個重要的角色:

  • 抽象人物角色IEmployee
  • 具体任务角色:EmployeeA、EmployeeB、EmployeeC
  • 委派这角色:Leader

真实应用场景

在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&#39;s HandlerMappings in order.
 * The HandlerAdapter will be obtained by querying the servlet&#39;s installed HandlerAdapters
 * to find the first that supports the handler class.
 * <p>All HTTP methods are handled by this method. It&#39;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一般都使用了委派模式。

委派模式的優缺點

  • #優點:透過任務委派,能夠將一個大型的任務細化,然後透過統一管理這些子任務的完成情況實現任務的跟進,能夠加快任務完成的速度。
  • 缺點:任務委派方式需要根據任務複雜程度進行不同的改變,在任務比較複雜的情況下,可能需要進行多重委派,容易造成混亂。

總結

#好了,關於委派模式就聊到這裡,你學會了嗎?

最後用一句話來總結委派模式:

需求是很簡單,但我不管

以上是韓信拜將:委派模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:Java后端技术全栈。如有侵權,請聯絡admin@php.cn刪除