博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板方法模式 - 大学新生报到案例
阅读量:5086 次
发布时间:2019-06-13

本文共 4076 字,大约阅读时间需要 13 分钟。

每年9月份,大学生开学季,社会主义的接班人们将进入向往的大学学习.....

大学报到有一个流程,咱们目前就简单分为两步,1.找学校,2.交学费

任何专业的学生都要执行找学校,但是每个专业的学生的学费价格有所不同

那我们就来实现大学报到。

 

一、报到第一步:找学校。

报到第一步找学校,这点就不用解释了。。

public abstract class Register {    /**     * 去学校     */    public final void goToSchool() {        System.out.println("大学新生报到:先到学校...");        pay();//找到学校后就要交学费。。    }    /**     * 交学费     */    public abstract void pay();}

此代码pay(交学费)为抽象函数,子类继承实现的时候,重写此函数。然后会在goToSchool中执行此函数。

 

二、报到第二步:交学费

报道完了,就要交学费了。。

此代码pay(交学费)为抽象函数,子类继承实现的时候,重写此函数。然后会在goToSchool中执行此函数。

此时,我们定义两个专业的大学生,分别为计算机专业和数学专业。

因为大学生报到,第一步找学校,肯定是公共的。

但是,第二步,交学费,就是按照专业的不同,而学费有差异。

首先定义一个计算机专业的学生

public class ITStudent extends Register {    @Override    public void pay() {        // TODO Auto-generated method stub        System.out.println("计算机专业学费1万");    }}

然后定义一个,数学专业的学生

 

public class MathStudent extends Register {    @Override    public void pay() {        // TODO Auto-generated method stub        System.out.println("数学专业学费5000");    }}

 

 

 

三、实现

public class Main {    public static void main(String[] args) {        // TODO Auto-generated method stub        Register reg = new ITStudent();        reg.goToSchool();        Register reg1 = new MathStudent();        reg1.goToSchool();    }}

 

四、源码实例

 我首先来介绍下,jsp工作机制。

首先,我有一个index.jsp,访问它时,会在tomcat的work目录中编译成一个index_jsp的类,

这个index_jsp又继承自抽象类HttpJspBase,抽象类HttpJspBase又继承了Servlet接口。

首先上HttpJspBase源码

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.jasper.runtime;import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.HttpJspPage;import org.apache.jasper.compiler.Localizer;/** * This is the super class of all JSP-generated servlets. * * @author Anil K. Vijendran */public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {    private static final long serialVersionUID = 1L;    protected HttpJspBase() {    }    @Override    public final void init(ServletConfig config)        throws ServletException    {        super.init(config);        jspInit();        _jspInit();    }    @Override    public String getServletInfo() {        return Localizer.getMessage("jsp.engine.info");    }    @Override    public final void destroy() {        jspDestroy();        _jspDestroy();    }    /**     * Entry point into service.     */    @Override    public final void service(HttpServletRequest request, HttpServletResponse response)        throws ServletException, IOException    {        _jspService(request, response);    }    @Override    public void jspInit() {    }    public void _jspInit() {    }    @Override    public void jspDestroy() {    }    protected void _jspDestroy() {    }    @Override    public abstract void _jspService(HttpServletRequest request,                                     HttpServletResponse response)        throws ServletException, IOException;}

在抽象类HttpJspBase中看到了实现Servlet接口中的service()方法时,里面放了_jspService(),但是此方法在抽象类中是抽象方法。

也就是上述方法,是作为模板。因为我们的jsp文件编译成的类(index_jsp),继承了HttpJspBase,所以在类 index_jsp 中,重写_jspService(),

就可以在Servlet生命周期中的service()函数来调用。

 

五、总结

此设计模式较为简单,一句话总结为:在父类中定义方法(上例中的pay方法),根据不同的子类,延迟在子类中得到不同的实现。

注意,goToSchool要为final,因为这个方法,不允许被子类重写的。

转载于:https://www.cnblogs.com/zh1996/p/10348897.html

你可能感兴趣的文章
移动端页面开发适配 rem布局原理
查看>>
Ajax中文乱码问题解决方法(服务器端用servlet)
查看>>
会计电算化常考题目一
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>
js 过滤敏感词
查看>>
poj2752 Seek the Name, Seek the Fame
查看>>
软件开发和软件测试,我该如何选择?(蜗牛学院)
查看>>
基本封装方法
查看>>
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>
两种最常用的Sticky footer布局方式
查看>>
Scrapy实战篇(三)之爬取豆瓣电影短评
查看>>
HDU 5510 Bazinga KMP
查看>>
[13年迁移]Firefox下margin-top问题
查看>>