java设计模式之委派模式
1.什么是委派模式
委派模式不屬于 23 種設(shè)計(jì)模式之一,是面向?qū)ο笤O(shè)計(jì)模式中常用的一種模式。
Spring MVC框架中的DispatcherServlet其實(shí)就用到了委派模式。
這種模式的原理為類 B和類 A 是兩個(gè)互相沒有任何關(guān)系的類,B 具有和 A 一模一樣的方法和屬性;并且調(diào)用 B 中的方法就是調(diào)用 A 中同名的方法。B 好像就是一個(gè)受 A 授權(quán)委托的中介。第三方的代碼不需要知道 A 的存在,也不需要和 A 發(fā)生直接的聯(lián)系,通過 B 就可以直接使用 A 的功能,這樣既能夠使用到 A 的各種功能,又能夠很好的將 A 保護(hù)起來了,一舉兩得。
| 行為性模式 | 要和代理模式區(qū)分開始。持有被委托人的飲用。不關(guān)心過程,只關(guān)心結(jié)果 | Dispatcher | 
?
2.委派模式的代碼實(shí)現(xiàn)
執(zhí)行的接口
public interface IExcuter {void excute(String command); }員工A
public class ExcuterA implements IExcuter { ?@Overridepublic void excute(String command) {System.out.println("員工A 開始做" + command + "的工作");} }員工B
public class ExcuterA implements IExcuter { ?@Overridepublic void excute(String command) {System.out.println("員工A 開始做" + command + "的工作");} }leader委派者
public class Leader implements IExcuter { ?private Map<String, IExcuter> targets = new HashMap<>(); ?public Leader() {targets.put("加密", new ExcuterA());targets.put("登錄", new ExcuterB());} ?@Overridepublic void excute(String command) {targets.get(command).excute(command);} }boss類模擬調(diào)用測(cè)試
public class Boss {public static void main(String[] args) {Leader leader = new Leader();//看上去好像是我們的項(xiàng)目經(jīng)理在干活//但實(shí)際干活的人是普通員工//這就是典型,干活是我的,功勞是你的leader.excute("登錄");leader.excute("加密");} }這里的員工A和員工B等同于SpringMVC的controller層方法,leader就是SpringMVC中的Dispatcher,boss類就相當(dāng)于瀏覽器。當(dāng)瀏覽器去輸入某一個(gè)請(qǐng)求時(shí),SpringMVC中的Dispatcher會(huì)接收請(qǐng)求,然后根據(jù)url去查詢有沒有對(duì)應(yīng)的controller,如果有的話則將該任務(wù)委派給對(duì)應(yīng)的controller處理,如果沒有則進(jìn)行其它邏輯。
下面模擬一個(gè)簡單的mvc調(diào)用的例子
MemberController.java
public class MemberController {public void getMemberById(String mid) {System.out.println("處理邏輯");} }SelvletDispatcher.java
public class SelvletDispatcher {//這里也可以用map 對(duì)象來保存Hanlder對(duì)象private List<Handler> handlerMapping = new ArrayList<Handler>(); ?public SelvletDispatcher() {//簡單實(shí)現(xiàn)一個(gè)controller的映射try {Class clazz = MemberController.class; ?handlerMapping.add(new Handler().setController(clazz.newInstance()).setMethod(clazz.getMethod("getMemberById", new Class[]{String.class})).setUrl("/member/getMemberById"));} catch (Exception e) {e.printStackTrace();}} ?private void doService(HttpServletRequest request, HttpServletResponse response) {doDispatch(request, response);} ?/*** 請(qǐng)求的分發(fā)工作** @param request* @param response*/private void doDispatch(HttpServletRequest request, HttpServletResponse response) {//1.獲取用戶請(qǐng)求的urlString uri = request.getRequestURI();Handler handler = null; ?2、根據(jù)uri 去handlerMapping找到對(duì)應(yīng)的hanlerfor (Handler h : handlerMapping) {if (uri.equals(h.getUrl())) {handler = h;break;}}//3.將具體的任務(wù)分發(fā)給Method(通過反射去調(diào)用其對(duì)應(yīng)的方法)Object obj = null;try {obj = handler.getMethod().invoke(handler.getController(), request.getParameter("mid"));} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}//4、獲取到Method執(zhí)行的結(jié)果,通過Response返回出去response.getWriter().write(obj); ?} ?/*** 具體的hanlder對(duì)象*/class Handler {//controller對(duì)象private Object controller;//controller對(duì)象映射的方法private String url;//ulr對(duì)應(yīng)的方法private Method method; ?public Object getController() {return controller;} ?public Handler setController(Object controller) {this.controller = controller;return this;} ?public String getUrl() {return url;} ?public Handler setUrl(String url) {this.url = url;return this;} ?public Method getMethod() {return method;} ?public Handler setMethod(Method method) {this.method = method;return this;}} ? }總結(jié)
以上是生活随笔為你收集整理的java设计模式之委派模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Linux之文件的压缩打包
- 下一篇: Linux之文件查找
