委派模式,是指什麼呢?從字面含義理解,委派就是委託安排的意思,委派模式就是在作具體某件事情的過程當中,交給其餘人來作,這個事件就是在個人完整鏈路上的一部分,可是複雜度較高的狀況下或者我不想作的狀況下,徹底能夠委派給另外一個類來處理,只要這個結果是符合個人預期的就能夠(至關於填空)。node
模板模式與委派模式的區別:模板模式更關注步驟,公共部分會放在模板的骨架步驟中完成,針對子類可能會有特殊的一些操做就能夠在特定步驟中從新實現,從模板模式中可以看到清晰的過程步驟。ide
代理模式與委派模式的區別:代理模式就是這個事情就根本不是我作的,可是我只能提供其中關鍵的一些信息,其餘的周邊或者在此基礎上的擴展均可以交給其餘人來作,完整的一個問題,可以獲得解決(這是目前理解到的代理模式,後續若是有更新,會從新對這裏進行修改)ui
(一) iOC相關部分中,在進行對象實例化的過程有用到委派模式?this
在doRegisterBeanDefinitions()即BeanDefinition進行註冊的過程當中,會設置BeanDefinitionParserDelegate類型的Delegate對象傳給this.delegate,並將這個對象做爲一個參數傳給:parseBeanDefinitions(root, this.delegate)中,而後主要的解析的工做就是經過delegate做爲主要角色來完成的,能夠看到下方代碼:url
/** * Parse the elements at the root level in the document: * "import", "alias", "bean". * @param root the DOM root element of the document */ protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { //判斷節點是否屬於同一命名空間,是則執行後續的解析 if (delegate.isDefaultNamespace(root)) { NodeList nl = root.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if (node instanceof Element) { Element ele = (Element) node; if (delegate.isDefaultNamespace(ele)) { parseDefaultElement(ele, delegate); } else { //註解定義的Context的nameSpace進入到這個分支中 delegate.parseCustomElement(ele); } } } } else { delegate.parseCustomElement(root); } }
其中最終可以走到bean註冊部分的是,會進入到parseDefaultElement(ele, delegate)中,而後針對不一樣的節點類型,針對bean的節點進行真正的註冊操做,而在這個過程當中,delegate會對element進行parseBeanDefinitionElement,獲得了一個BeanDefinitionHolder類型的對象,以後經過這個對象完成真正的註冊到Factory的操做spa
(二) 在SpringMVC中,類DispatcherServlet,就是:用於HTTP請求處理程序/控制器的中央調度程序,針對經過WEB UI輸入的url請求,委派給DispatcherServlet處理,從委派者的角度來看,關注結果便可代理
(三) 實際生活的例子:委派能夠理解成Leader來作工做,也會作一部分,只是將其中一個部分交給Member來作,Member按照本身的方式作完以後,Leader只關注結果(這是一個兩方的關係,代理模式是一個三方的關係,例如房東+中介+租客,中介相對於房東和租客來講,都是代理)。code
分別爲:Leader類、Member類、StaffdoTask類、StaffInfo類、Task類對象
其中Task類爲:任務類;StaffInfo類:僱員信息類;StaffdoTask類:僱員作任務類;Leader類:組長類(委派者),Member類:組員類(被委派者)blog
Task類代碼以下:
public class Task { String id; String name; String step; String deadline; public Task(String id, String name, String step, String deadline) { this.id = id; this.name = name; this.step = step; this.deadline = deadline; } public String getId() { return id; } public String getName() { return name; } public String getDeadline() { return deadline; } public String getStep() { return step; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setDeadline(String deadline) { this.deadline = deadline; } public void setStep(String step) { this.step = step; } }
StaffInfo類:
public class StaffInfo { String staffid; String staffname; public StaffInfo(String staffid, String staffname) { this.staffid = staffid; this.staffname = staffname; } public String getStaffid() { return staffid; } public void setStaffid(String staffid) { this.staffid = staffid; } public String getStaffname() { return staffname; } public void setStaffname(String staffname) { this.staffname = staffname; } }
StaffdoTask接口,Leader類和Member類實現了該接口
public interface StaffdoTask { public void doTask(StaffInfo staffInfo, Task task); }
Leader類:
public class Leader{ //假設Leader的角色爲區域銷售主管,針對店鋪進行人員盤點,將A人員分配到1區,將B人員分配到2區 //店長鬚要針對區域進行總體管理,包含人員的考勤、平常管理和工做訪談、人員培養等 //其中銷售的工做給到不一樣的區的人員主負責 public void doTask() { Task task_gongzuofangtan = new Task("1", "工做訪談", "一、跟進每一個區的工做負責人,二、進行訪談交流,三、彙總結果", "20190823"); Task task_kaoqin = new Task("2", "考勤管理", "一、查看每日每人的考勤狀況,二、輸出考勤報表", "20190823"); Task[] task_xiaoshou = new Task[3]; Task xiaoshou_1 = new Task("3", "銷售", "一、A區域內的人員出售車輛", "2019-0824"); Task xiaoshou_2 = new Task("3", "銷售", "一、B區域內的人員出售車輛", "2019-0824"); Task xiaoshou_3 = new Task("3", "銷售", "一、C區域內的人員出售車輛", "2019-0824"); task_xiaoshou[0] = xiaoshou_1; task_xiaoshou[1] = xiaoshou_2; task_xiaoshou[2] = xiaoshou_3; Task task_huizong = new Task("4", "彙總", "一、將各個區的工做進行整理,二、彙總輸出報告", "20190826"); //作本身的工做 doRealTask(task_gongzuofangtan); doRealTask(task_kaoqin); StaffInfo[] staff_xiaoshou = new StaffInfo[3]; StaffInfo staff_1 = new StaffInfo("1023", "A"); StaffInfo staff_2 = new StaffInfo("1024", "B"); StaffInfo staff_3 = new StaffInfo("1025", "C"); staff_xiaoshou[0] = staff_1; staff_xiaoshou[1] = staff_2; staff_xiaoshou[2] = staff_3; doDispatcherTask(task_xiaoshou, staff_xiaoshou); doRealTask(task_huizong); } public void doRealTask(Task task){ // System.out.println("task info"); System.out.println("taskid:" + task.id + " taskname:" + task.name + " taskstep:" + task.step + " taskdeadline:" + task.deadline); } //Desc:進行任務分發處理 public void doDispatcherTask(Task[] tasks, StaffInfo[] staffInfos){ System.out.println("作銷售任務的委派"); for (int i = 0; i < tasks.length; i++){ Member member = new Member(); member.doTask(staffInfos[i], tasks[i]); } } public static void main(String[] args){ System.out.println("開始工做,並作好任務分派"); Leader leader = new Leader(); leader.doTask(); } }
Member類:
public class Member implements StaffdoTask{ @Override public void doTask(StaffInfo staffInfo, Task task) { System.out.println("statff " + staffInfo.staffid + "do the task:" + task.id + " " +task.name + " " + task.step + " " + task.deadline); } }
其中Leader類的main代碼運行以後,結果以下: