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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

委派模式与策略模式综合应用

發布時間:2024/4/13 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 委派模式与策略模式综合应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在上面的代碼中我們列舉了非常幾個業務場景,相信小伙伴對委派模式和策略模式有了非常深刻的理解了。現在,我們再來回顧一下,DispatcherServlet 的委派邏輯,代碼如下:

private void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception{String uri = request.getRequestURI();String mid = request.getParameter("mid");if("getMemberById".equals(uri)){new MemberController().getMemberById(mid);}else if("getOrderById".equals(uri)){new OrderController().getOrderById(mid);}else if("logout".equals(uri)){new SystemController().logout();}else {response.getWriter().write("404 Not Found!!");}}

這樣的代碼擴展性不太優雅,也不現實,因為我們實際項目中一定不止這幾個Controller,往往是成千上萬個Controller,顯然,我們不能寫成千上萬個if...else... 。那么我們如何來改造呢?小伙伴們一定首先就想到了策略模式,來看一下我是怎么優化的:

public class DispatcherServlet extends HttpServlet{private List<Handler> handlerMapping = new ArrayList<Handler>();public void init() throws ServletException {try {Class<?> memberControllerClass = MemberController.class;handlerMapping.add(new Handler().setController(memberControllerClass.newInstance()).setMethod(memberControllerClass.getMethod("getMemberById", new Class[]{String.class})).setUrl("/web/getMemberById.json"));}catch(Exception e){}}private void doDispatch(HttpServletRequest request, HttpServletResponse response){//1、獲取用戶請求的url// 如果按照J2EE的標準、每個url對對應一個Serlvet,url由瀏覽器輸入String uri = request.getRequestURI();//2、Servlet拿到url以后,要做權衡(要做判斷,要做選擇)// 根據用戶請求的URL,去找到這個url對應的某一個java類的方法//3、通過拿到的URL去handlerMapping(我們把它認為是策略常量)Handler handle = null;for (Handler h: handlerMapping) {if(uri.equals(h.getUrl())){handle = h;break;}}//4、將具體的任務分發給Method(通過反射去調用其對應的方法)Object object = null;try {object = handle.getMethod().invoke(handle.getController(),request.getParameter("mid"));} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}//5、獲取到Method執行的結果,通過Response返回出去 // response.getWriter().write();}protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {doDispatch(req,resp);} catch (Exception e) {e.printStackTrace();}}class Handler{private Object controller;private Method method;private String url;public Object getController() {return controller;}public Handler setController(Object controller) {this.controller = controller;return this;}public Method getMethod() {return method;}public Handler setMethod(Method method) {this.method = method;return this;}public String getUrl() {return url;}public Handler setUrl(String url) {this.url = url;return this;}}}

上面的代碼我結合了策略模式、工廠模式、單例模式。當然,我的優化方案不一定是最完美的,僅代表個人觀點。感興趣的小伙伴可以繼續思考,如何讓這段代碼變得更優雅。當然,我們后面在講Spring 源碼時還會講到DispatcherServlet 的相關內容。

?

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的委派模式与策略模式综合应用的全部內容,希望文章能夠幫你解決所遇到的問題。

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