2026/2/22 23:33:35
网站建设
项目流程
网站建设个人接单,php语言的网站建设,平原网站建设费用,开发软件是什么专业文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析0.个人感悟
个人对这个模式印象很深#xff0c;属于是工作中自己无意识地用到过#xff0c;后面看书才发现原来已…文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析0.个人感悟个人对这个模式印象很深属于是工作中自己无意识地用到过后面看书才发现原来已有前辈总结出这个模式并且更加全面模版方法模式真的是很典型、很实用建议大家可以在代码中尝试尝试模版方法整体是基于继承机制的代码复用有利于感受抽象、封装、继承、多态的魅力模版方法模式很好地展现了开闭原则和实现开闭地一个方式: 将变化(具体实现)与不变的部分(算法骨架)分离1. 概念英文定义(《设计模式可复用面向对象软件的基础》)Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without chaging the algorithm’s structure.中文翻译定义一个操作中的算法骨架将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。理解模板方法模式是一种行为型设计模式父类抽象类定义了一个算法的固定框架和流程模板方法具体步骤的实现延迟到子类中完成子类可以重写某些特定步骤但不能改变算法的整体结构通过钩子方法Hook Method提供额外的扩展点允许子类对算法的某些部分进行可选的重写2. 适配场景2.1 适合的场景当多个类有相同的方法流程但某些步骤的实现不同时,需要提取公共行为到父类避免代码重复存在固定的算法骨架但具体步骤需要灵活变化,需要控制子类的扩展方式确保算法结构不被破坏2.2 常见场景举例制作饮料冲泡咖啡、茶的流程相似烧水、冲泡、加调料但具体步骤不同数据导入处理读取数据、验证数据、处理数据、保存数据的流程固定但不同数据源处理方式不同Spring框架的JdbcTemplate连接数据库、执行SQL、处理结果集、关闭连接的流程固定各种初始化流程游戏初始化、应用启动、设备自检等有固定步骤但细节不同的场景3. 实现方法3.1 实现思路创建抽象类定义算法的骨架定义模板方法使用final修饰防止子类改变算法结构定义抽象方法子类必须实现的具体步骤定义具体方法父类提供的默认实现子类可选择是否重写定义钩子方法提供默认实现子类可选择重写以影响算法流程创建具体子类实现抽象方法可选重写钩子方法3.2 UML类图角色说明AbstractClass抽象类定义模板方法和算法骨架ConcreteClass具体子类实现抽象步骤可选重写钩子方法3.3 代码示例制作饮料,冲泡咖啡、茶的流程相似烧水、冲泡、加调料但具体步骤不同定义模版:publicabstractclassBeverageTemplate{// 定义算法骨架 final防止子类篡改/** * description 制作饮料 * author bigHao * date 2026/1/20 **/publicfinalvoidprepareBeverage(){boilWater();brew();pourInCup();if(customerWantsCondiments()){addCondiments();}hook();}// 通用流程/** * description 烧水 * author bigHao * date 2026/1/20 **/privatevoidboilWater(){System.out.println(烧水);}// 通用流程/** * description 倒饮料 * author bigHao * date 2026/1/20 **/privatevoidpourInCup(){System.out.println(将饮料倒入杯子);}// 特异流程子类实现/** * description 酿造 * author bigHao * date 2026/1/20 **/protectedabstractvoidbrew();// 特异流程子类实现/** * description 添加作料 * author bigHao * date 2026/1/20 **/protectedabstractvoidaddCondiments();// 钩子方法-子类可以重写用于流程控制/** * description 钩子方法 * author bigHao * date 2026/1/20 **/protectedvoidhook(){// 默认空实现}// 钩子方法用于流程控制子类可以重写/** * return boolean 是否需要 * description 客户需要作料 * author bigHao * date 2026/1/20 **/protectedbooleancustomerWantsCondiments(){returntrue;}}具体实现:publicclassCoffeeextendsBeverageTemplate{Overrideprotectedvoidbrew(){System.out.println(沸水冲泡咖啡);}OverrideprotectedvoidaddCondiments(){System.out.println(加入糖和牛奶);}Overrideprotectedvoidhook(){super.hook();System.out.println(hook);}}publicclassTeaextendsBeverageTemplate{Overrideprotectedvoidbrew(){System.out.println(沸水煮茶叶);}OverrideprotectedvoidaddCondiments(){System.out.println(加入柠檬);}}测试:publicclassClient{staticvoidmain(){System.out.println( 制作coffee );BeverageTemplatecoffeenewCoffee();coffee.prepareBeverage();System.out.println( 制作tea );BeverageTemplateteanewTea();tea.prepareBeverage();}}输出: 制作coffee 烧水 用非税冲泡咖啡 将饮料倒入杯子 加入糖和牛奶 hook 制作tea 烧水 沸水煮茶叶 将饮料倒入杯子 加入柠檬4. 优缺点4.1 优点提高代码复用性将公共行为提取到父类避免代码重复良好的扩展性通过增加新的子类可以轻松扩展算法符合开闭原则对扩展开放新增子类对修改关闭不修改模板方法提高可维护性算法结构清晰便于理解和维护封装不变部分将不变的行为封装在父类可变行为由子类实现4.2 缺点可能导致类数量增加每个不同的实现都需要一个子类父类与子类耦合子类必须实现父类的抽象方法限制了子类的灵活性子类不能改变算法的整体结构继承的固有缺点Java单继承限制子类无法继承其他类调试困难模板方法中的流程控制可能使调试变得复杂5. 源码分析Spring中的HttpServlet类service()方法分析// javax.servlet.http.HttpServlet 中的模板方法模式应用publicabstractclassHttpServletextendsGenericServlet{// 模板方法protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{Stringmethodreq.getMethod();if(method.equals(GET)){// 调用具体方法doGet(req,resp);}elseif(method.equals(POST)){doPost(req,resp);}elseif(method.equals(PUT)){doPut(req,resp);}// ... 其他HTTP方法}// 钩子方法 - 子类需要实现具体处理逻辑protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 默认实现返回405错误方法不允许resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);}protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);}// ... 其他HTTP方法对应的钩子方法}分析模板方法service()方法定义了HTTP请求处理的整体流程具体步骤根据HTTP方法类型GET、POST等分发到不同的处理方法钩子方法doGet()、doPost()等由子类实现具体的业务逻辑默认实现父类提供错误响应的默认实现扩展方式开发者继承HttpServlet只需重写需要处理的HTTP方法使用示例WebServlet(/user)publicclassUserServletextendsHttpServlet{OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 处理GET请求查询用户信息// ...}OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 处理POST请求创建用户// ...}}参考韩顺平 Java设计模式张维鹏 Java设计模式之行为型模板方法模式java_my_life 《JAVA与模式》之模板方法模式