日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

java设计模式之委派模式

發布時間:2025/3/20 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java设计模式之委派模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.什么是委派模式

委派模式不屬于 23 種設計模式之一,是面向對象設計模式中常用的一種模式。

Spring MVC框架中的DispatcherServlet其實就用到了委派模式。

這種模式的原理為類 B和類 A 是兩個互相沒有任何關系的類,B 具有和 A 一模一樣的方法和屬性;并且調用 B 中的方法就是調用 A 中同名的方法。B 好像就是一個受 A 授權委托的中介。第三方的代碼不需要知道 A 的存在,也不需要和 A 發生直接的聯系,通過 B 就可以直接使用 A 的功能,這樣既能夠使用到 A 的各種功能,又能夠很好的將 A 保護起來了,一舉兩得。

歸類特點舉例
行為性模式要和代理模式區分開始。持有被委托人的飲用。不關心過程,只關心結果Dispatcher

?

2.委派模式的代碼實現

執行的接口

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類模擬調用測試

public class Boss {public static void main(String[] args) {Leader leader = new Leader();//看上去好像是我們的項目經理在干活//但實際干活的人是普通員工//這就是典型,干活是我的,功勞是你的leader.excute("登錄");leader.excute("加密");} }

這里的員工A和員工B等同于SpringMVC的controller層方法,leader就是SpringMVC中的Dispatcher,boss類就相當于瀏覽器。當瀏覽器去輸入某一個請求時,SpringMVC中的Dispatcher會接收請求,然后根據url去查詢有沒有對應的controller,如果有的話則將該任務委派給對應的controller處理,如果沒有則進行其它邏輯。

下面模擬一個簡單的mvc調用的例子

MemberController.java

public class MemberController {public void getMemberById(String mid) {System.out.println("處理邏輯");} }

SelvletDispatcher.java

public class SelvletDispatcher {//這里也可以用map 對象來保存Hanlder對象private List<Handler> handlerMapping = new ArrayList<Handler>(); ?public SelvletDispatcher() {//簡單實現一個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);} ?/*** 請求的分發工作** @param request* @param response*/private void doDispatch(HttpServletRequest request, HttpServletResponse response) {//1.獲取用戶請求的urlString uri = request.getRequestURI();Handler handler = null; ?2、根據uri 去handlerMapping找到對應的hanlerfor (Handler h : handlerMapping) {if (uri.equals(h.getUrl())) {handler = h;break;}}//3.將具體的任務分發給Method(通過反射去調用其對應的方法)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執行的結果,通過Response返回出去response.getWriter().write(obj); ?} ?/*** 具體的hanlder對象*/class Handler {//controller對象private Object controller;//controller對象映射的方法private String url;//ulr對應的方法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;}} ? }

總結

以上是生活随笔為你收集整理的java设计模式之委派模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。