大家好,我是老田,從今天開始,本公眾號每週給大家送福利
,送什麼呢?肯定是技術書啦,沒那麼多花俏的,參與方式見文末。
好啦,進入我們的主題,今天我要跟大家分享設計模式中的委派模式
。用貼切的生活故事,以及真實專案場景來講設計模式,最後用一句話來總結這個設計模式。
故事
從字面上來看,委派:指委託安排;委任派遣 。
在我們技術領域有個模式也叫委派模式,但委派模式不屬於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中文網其他相關文章!

JVMmanagesgarbagecollectionacrossplatformseffectivelybyusingagenerationalapproachandadaptingtoOSandhardwaredifferences.ItemploysvariouscollectorslikeSerial,Parallel,CMS,andG1,eachsuitedfordifferentscenarios.Performancecanbetunedwithflagslike-XX:NewRa

Java代碼可以在不同操作系統上無需修改即可運行,這是因為Java的“一次編寫,到處運行”哲學,由Java虛擬機(JVM)實現。 JVM作為編譯後的Java字節碼與操作系統之間的中介,將字節碼翻譯成特定機器指令,確保程序在任何安裝了JVM的平台上都能獨立運行。

Java程序的編譯和執行通過字節碼和JVM實現平台獨立性。 1)編寫Java源碼並編譯成字節碼。 2)使用JVM在任何平台上執行字節碼,確保代碼的跨平台運行。

Java性能与硬件架构密切相关,理解这种关系可以显著提升编程能力。1)JVM通过JIT编译将Java字节码转换为机器指令,受CPU架构影响。2)内存管理和垃圾回收受RAM和内存总线速度影响。3)缓存和分支预测优化Java代码执行。4)多线程和并行处理在多核系统上提升性能。

使用原生庫會破壞Java的平台獨立性,因為這些庫需要為每個操作系統單獨編譯。 1)原生庫通過JNI與Java交互,提供Java無法直接實現的功能。 2)使用原生庫增加了項目複雜性,需要為不同平台管理庫文件。 3)雖然原生庫能提高性能,但應謹慎使用並進行跨平台測試。

JVM通過JavaNativeInterface(JNI)和Java標準庫處理操作系統API差異:1.JNI允許Java代碼調用本地代碼,直接與操作系統API交互。 2.Java標準庫提供統一API,內部映射到不同操作系統API,確保代碼跨平台運行。

modularitydoesnotdirectlyaffectJava'splatformindependence.Java'splatformindependenceismaintainedbytheJVM,butmodularityinfluencesapplicationstructureandmanagement,indirectlyimpactingplatformindependence.1)Deploymentanddistributionbecomemoreefficientwi

BytecodeinJavaistheintermediaterepresentationthatenablesplatformindependence.1)Javacodeiscompiledintobytecodestoredin.classfiles.2)TheJVMinterpretsorcompilesthisbytecodeintomachinecodeatruntime,allowingthesamebytecodetorunonanydevicewithaJVM,thusfulf


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。