韓信拜將:委派模式
大家好,我是老田,從今天開始,本公眾號每週給大家送福利
,送什麼呢?肯定是技術書啦,沒那麼多花俏的,參與方式見文末。
好啦,進入我們的主題,今天我要跟大家分享設計模式中的委派模式
。用貼切的生活故事,以及真實專案場景來講設計模式,最後用一句話來總結這個設計模式。
故事
從字面上來看,委派:指委託安排;委任派遣 。
在我們技術領域有個模式也叫委派模式,但委派模式不屬於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'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
一般都使用了委派模式。
委派模式的優缺點
#優點:透過任務委派,能夠將一個大型的任務細化,然後透過統一管理這些子任務的完成情況實現任務的跟進,能夠加快任務完成的速度。 缺點:任務委派方式需要根據任務複雜程度進行不同的改變,在任務比較複雜的情況下,可能需要進行多重委派,容易造成混亂。
總結
#好了,關於委派模式就聊到這裡,你學會了嗎?
最後用一句話來總結委派模式:
需求是很簡單,但我不管
以上是韓信拜將:委派模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

Spring Boot簡化了可靠,可擴展和生產就緒的Java應用的創建,從而徹底改變了Java開發。 它的“慣例慣例”方法(春季生態系統固有的慣例),最小化手動設置
