温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么使用java模板模式

发布时间:2021-10-29 14:44:30 来源:亿速云 阅读:119 作者:iii 栏目:web开发

这篇文章主要介绍“怎么使用java模板模式”,在日常操作中,相信很多人在怎么使用java模板模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用java模板模式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、介绍

模板模式,顾名思义,定义一个模板,将部分逻辑以具体方法或者具体构造函数的形式实现,在抽象类中声明一些抽象方法来迫使子类实现剩余的逻辑。

不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意。

模板模式涉及到三个角色:

  • 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架;

  • 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法;

  • 客户角色:客户类提出使用具体类的请求;

二、示例

举个例子,以早上起床到上班所需要的操作为例,大致流程可以分为以下几步:穿衣服、刷牙、洗脸、吃早餐等。男生和女生的操作可能有些区别。

我们创建一个抽象的类,定义好大致的操作流程,如下:

/**  * 抽象类  */ public abstract class AbstractPerson {      /**      * 定义操作流程      */     public void prepareGoWorking(){         dressing();//穿衣服         brushTeeth();//刷牙         washFace();//洗脸         eatBreakFast();//吃早餐     }      /**穿衣服*/     protected abstract void dressing();      /**刷牙*/     protected void brushTeeth(){         System.out.println("刷牙");     }      /**洗脸*/     protected void washFace(){         System.out.println("洗脸");     }      /**吃早餐*/     protected abstract void eatBreakFast();  }

因为男生和女生的行为不一样,我们分别创建两个具体类,如下:

/**  * 男生  * 具体实现类  */ public class ManPerson extends AbstractPerson{      @Override     protected void dressing() {         System.out.println("穿西装");     }      @Override     protected void eatBreakFast() {         System.out.println("直接在公司吃早餐");     } }
/**  * 女生  * 具体实现类  */ public class WomanPerson extends AbstractPerson{      @Override     protected void dressing() {         System.out.println("穿休闲衣服");     }      @Override     protected void eatBreakFast() {         System.out.println("在家弄点吃的,或者在外面买一点小吃");     } }

创建一个客户端,实现如下:

public class TemplateClient {      public static void main(String[] args) {         //男生起床步骤         ManPerson manPerson = new ManPerson();         System.out.println("-----男生起床步骤----");         manPerson.prepareGoWorking();         System.out.println("-----女生起床步骤----");         //女生起床步骤         WomanPerson womanPerson = new WomanPerson();         womanPerson.prepareGoWorking();     } }

输出结果:

-----男生起床步骤---- 穿西装 刷牙 洗脸 直接在公司吃早餐 -----女生起床步骤---- 穿休闲衣服 刷牙 洗脸 在家弄点吃的,或者在外面买一点小吃

当然,模版模式的玩法,还不仅仅只有这些,还可以在模版模式中使用挂钩(hook)。

什么是hook呢?存在一个空实现的方法,我们称这种方法为hook。子类可以视情况来决定是否要覆盖它。

还是以上面为例子,比如吃完早餐就要出门上班,选择什么交通工具呢?

抽象类新增方法hook(),内容如下:

/**  * 抽象类  */ public abstract class AbstractPerson {      /**      * 定义操作流程      */     public void prepareGoWorking(){         dressing();//穿衣服         brushTeeth();//刷牙         washFace();//洗脸         eatBreakFast();//吃早餐         hook();//挂钩     }      /**穿衣服*/     protected abstract void dressing();      /**刷牙*/     protected void brushTeeth(){         System.out.println("刷牙");     }      /**洗脸*/     protected void washFace(){         System.out.println("洗脸");     }      /**吃早餐*/     protected abstract void eatBreakFast();      /**挂钩*/     protected void hook(){};  }

男生具体实现类,重写hook()方法,内容如下:

/**  * 男生  * 具体实现类  */ public class ManPerson extends AbstractPerson{      @Override     protected void dressing() {         System.out.println("穿西装");     }      @Override     protected void eatBreakFast() {         System.out.println("直接在公司吃早餐");     }      @Override     protected void hook() {         System.out.println("乘地铁上班");     } }

运行测试类,男生具体实现类,输出结果:

-----男生起床步骤---- 穿西装 刷牙 洗脸 直接在公司吃早餐 乘地铁上班

当然,还有其他的玩法,比如女生洗完脸之后,可能需要化妆,我们再次将抽象类进行处理,内容如下:

/**  * 抽象类  */ public abstract class AbstractPerson {      /**      * 定义操作流程      */     public void prepareGoWorking(){         dressing();//穿衣服         brushTeeth();//刷牙         washFace();//洗脸         //是否需要化妆,默认不化妆         if(isMakeUp()){             System.out.println("进行化妆");         }         eatBreakFast();//吃早餐         hook();//挂钩     }      /**是否需要化妆方法*/     protected boolean isMakeUp(){         return false;     }      /**穿衣服*/     protected abstract void dressing();      /**刷牙*/     protected void brushTeeth(){         System.out.println("刷牙");     }      /**洗脸*/     protected void washFace(){         System.out.println("洗脸");     }      /**吃早餐*/     protected abstract void eatBreakFast();      /**挂钩*/     protected void hook(){};  }

女生具体实现类,重写isMakeUp()方法,内容如下:

/**  * 女生  * 具体实现类  */ public class WomanPerson extends AbstractPerson{      @Override     protected void dressing() {         System.out.println("穿休闲衣服");     }      @Override     protected void eatBreakFast() {         System.out.println("在家弄点吃的,或者在外面买一点小吃");     }      @Override     protected boolean isMakeUp() {         return true;     } }

运行测试类,女生具体实现类,输出结果:

-----女生起床步骤---- 穿休闲衣服 刷牙 洗脸 进行化妆 在家弄点吃的,或者在外面买一点小吃

三、应用

模版设计模式,应用非常广泛,比如javaEE中的servlet,当我们每创建一个servlet的时候,都会继承HttpServlet,其实HttpServlet已经为我们提供一套操作流程,我们只需要重写里面的方法即可!

怎么使用java模板模式

HttpServlet 的部分源码如下:

public abstract class HttpServlet extends GenericServlet {     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         // ...     }     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         // ...     }     protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         // ...     }     protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         // ...     }     protected void doDelete(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {         // ...     }     protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         // ...     }     protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         // ...     }          protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         String method = req.getMethod();          if (method.equals(METHOD_GET)) {             long lastModified = getLastModified(req);             if (lastModified == -1) {                 // servlet doesn't support if-modified-since, no reason                 // to go through further expensive logic                 doGet(req, resp);             } else {                 long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);                 if (ifModifiedSince < lastModified) {                     // If the servlet mod time is later, call doGet()                     // Round down to the nearest second for a proper compare                     // A ifModifiedSince of -1 will always be less                     maybeSetLastModified(resp, lastModified);                     doGet(req, resp);                 } else {                     resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);                 }             }          } else if (method.equals(METHOD_HEAD)) {             long lastModified = getLastModified(req);             maybeSetLastModified(resp, lastModified);             doHead(req, resp);          } else if (method.equals(METHOD_POST)) {             doPost(req, resp);                      } else if (method.equals(METHOD_PUT)) {             doPut(req, resp);                      } else if (method.equals(METHOD_DELETE)) {             doDelete(req, resp);                      } else if (method.equals(METHOD_OPTIONS)) {             doOptions(req,resp);                      } else if (method.equals(METHOD_TRACE)) {             doTrace(req,resp);                      } else {             //             // Note that this means NO servlet supports whatever             // method was requested, anywhere on this server.             //              String errMsg = lStrings.getString("http.method_not_implemented");             Object[] errArgs = new Object[1];             errArgs[0] = method;             errMsg = MessageFormat.format(errMsg, errArgs);                          resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);         }     }          // ...省略... }

自定义一个 HelloWorld 的 Servlet 类,如下:

import java.io.*; import javax.servlet.*; import javax.servlet.http.*;  public class HelloWorld extends HttpServlet {    public void init() throws ServletException {     // ...   }    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       response.setContentType("text/html");       PrintWriter out = response.getWriter();       out.println("<h2>Hello World!</h2>");   }      public void destroy() {       // ...   } }

到此,关于“怎么使用java模板模式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI