OrderController 类 :
public class OrderController { public void getOrderById(String mid) { } }
SystemController 类:
public class SystemController { public void logout() { } }
创建 DispatcherServlet 类:
public class DispatcherServlet extends HttpServlet { private Map<String, Method> handlerMapping = new HashMap<String, Method>(); @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doDispatch(req, resp); } private void doDispatch(HttpServletRequest req, HttpServletResponse resp) { String url = req.getRequestURI(); Method method = handlerMapping.get(url); // method.invoke(); } @Override public void init() throws ServletException { try { handlerMapping.put("/web/getMemeberById.json", MemberController.class.getMethod("getMemberById", String.class)); } catch (Exception e) { e.printStackTrace(); } } }
配置 web.xml 文件 :
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>Gupao Web Application</display-name> <servlet> <servlet-name>delegateServlet</servlet-name> <servlet-class>com.gupaoedu.vip.pattern.delegate.mvc.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>delegateServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
一个完整的委派模式就实现出来了。当然,在 Spring 中运用到委派模式不仅千此,还有很多。小伙伴们可以通过命名就可以识别。在 Spring 源码中 , 只要以 Delegate 结尾的都是实现了委派模式。例
如: BeanDefinitionParserDelegate 根据不同类型委派不同的逻辑解析 BeanDefinition。
四、委派模式的优缺点
优点:
通过任务委派能够将—个大型的任务细化,然后通过统—管理这些子任务的完成情况实现任务的跟进,能够加快任务执行的效率。
缺点:
任务委派方式需要根据任务的复杂程度进行不同的改变,在任务比较复杂的情况下可能需要进行多
重委派,容易造成索乱。
五、模板模式 定义
模板模式 ( Template Method Pattern) 又叫模板方法模式,是指定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不沈变一个算法的结构即可重定义该算法的某些特定步骤,属于行为型设计模式。
模板方法模式实际上是封装了一个固定流程,该流程由几个步骤组成,具体步骤可以由子类进行不同实现,从而让固定的流程产生不同的结果。它非第简单, 其实就是类的继承机制,但它却是一个应用非常广泛的模式。模板方法模式的本质是抽象封装流程,具体进行实现。
应用场景:
当完成一个操作具有固定的流程时 , 由抽象固定流程步骤 , 具体步骤交给子类进行具体实现(固定的流程 , 不同的实现 ) 。
在我们日室生活中模板方法模式也很室见。 比如我们平时办理入职流程填写入职登记表一打印简历一复印学历一复印身份证一签订劳动合同一建立花名册一办理工牌一安排工位等;再比如 , 我平时在家里炒菜:洗锅一点火 一热锅一上油一下原料一翻炒 一放调料一出锅;再
比如有个小品 , 赵本山问宋丹丹: “如何把大象放进冰箱? ” 宋丹丹回答: “第—步:打开冰箱门, 第二步:把大象哀进冰箱 , 第三步:关闭冰箱门” 。赵本山再问: “怎么把长劲鹿放进冰箱? ” 宋f]f]答:“第—步:打开冰箱门, 第二步:把大象拿出来 , 第三步:把长劲鹿哀进去 , 第四步:关闭冰箱门” (如下图所示 ), 这些都是模板方法模式的体现。
模板方法中的钩子方法
我们还是以大学校园的课程创建流程为例:发布预习资料→ 制作课件 PPT → 在线直播→ 提交
课堂笔记→ 提交源码→ 布置作业→ 检查作业。 首先我们来创建 AbastractCourse 抽象类:
public abstract class AbastractCourse { public final void createCourse(){ //1、发布预习资料 postPreResoucse(); //2、制作课件 createPPT(); //3、直播授课 liveVideo(); //4、上传课后资料 postResource(); //5、布置作业 postHomework(); if(needCheckHomework()){ checkHomework(); } } protected abstract void checkHomework(); //钩子方法 protected boolean needCheckHomework(){return false;} protected void postHomework(){ System.out.println("布置作业"); } protected void postResource(){ System.out.println("上传课后资料"); } protected void liveVideo(){ System.out.println("直播授课"); } protected void createPPT(){ System.out.println("制作课件"); } protected void postPreResoucse(){ System.out.println("发布预习资料"); } }