设计模式-模版模式

159 阅读2分钟

一、模式的定义

定义一个操作的算法骨架,而将一些步骤延迟到之类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤;

二、示例代码

 1 /**
 2  * 类描述:  装饰方法模式
 3  *
 4  * @author XXSD
 5  * @version 1.0.0
 6  * @date 2020/2/4 0004 下午 3:38
 7  */
 8 public class TemplateMethodTest {
 9     public static void main(String[] values) {
10         AbstractClass abstractClass = new SubClass();
11         abstractClass.operation();
12     }
13 }
14 
15 /**
16  * 类描述: 抽象算法对象
17  * 这里决定我们的算法骨架
18  *
19  * @author : XXSD
20  * @date : 2020/2/4 0004 下午 3:40
21  */
22 abstract class AbstractClass {
23     /**
24     * 功能描述:基础算法方法
25     * @author : XXSD
26     * @date : 2020/2/4 0004 下午 3:41
27     */
28     final void operation(){
29         /*
30         * 这里定义我们的运算方法
31         * 这里定义的业务都是使用者不需要关心但是又是必要的处理;
32         * 例如:
33         * 1)打开链接;
34         * 2)发送消息;
35         * 3)关闭链接;
36         * */
37         System.out.println("预定义算法发放被调用");
38         //执行拓展点方法
39         templateMethod();
40         System.out.println("首尾工作");
41         
42     }
43 
44     /**
45     * 功能描述:用户自定义的拓展点
46     * @author : XXSD
47     * @date : 2020/2/4 0004 下午 3:45
48     */
49     protected abstract void templateMethod();
50 }
51 
52 /**
53 * 类描述: 子类实现
54 * @author : XXSD
55 * @date : 2020/2/4 0004 下午 3:46
56 */
57 class SubClass extends AbstractClass{
58 
59     /**
60      * 功能描述:用户自定义的拓展点
61      *
62      * @author : XXSD
63      * @date : 2020/2/4 0004 下午 3:45
64      */
65     @Override
66     protected void templateMethod() {
67         System.out.println(this.getClass().getSimpleName() + "执行templateMethod()方法");
68     }
69 }

三、在Java中的经典应用

3.1)javax.servlet.http.HttpServlet

可以看到如下注释

 1 * Provides an abstract class to be subclassed to create
 2  * an HTTP servlet suitable for a Web site. A subclass of
 3  * <code>HttpServlet</code> must override at least 
 4  * one method, usually one of these:
 5  *
 6  * <ul>
 7  * <li> <code>doGet</code>, if the servlet supports HTTP GET requests
 8  * <li> <code>doPost</code>, for HTTP POST requests
 9  * <li> <code>doPut</code>, for HTTP PUT requests
10  * <li> <code>doDelete</code>, for HTTP DELETE requests
11  * <li> <code>init</code> and <code>destroy</code>, 

大意如下:

1 提供一个创建适合Web站点的HTTP servlet的抽象类,必须至少覆盖doGet、doPost、doPut、doDelete、init、destroy任意一种方法

此类中的重要方法就是:protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
此方法中定义了相关的骨架,根据逻辑的不同区别分别调用不同的方法;

3.2)org.springframework.web.servlet.mvc.AbstractController

这个类是模版方法在SpringMVC中的经典应用;

1 protected abstract ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) 2 throws Exception;

这个方法就是我们的模版方法模式的拓展点;

1 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 2 throws Exception {

这个方法就是模版方法模式的算法骨架方法;