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