java设计模式(9):模板方法模式(TemplateMethod)
一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
二,类图:
三,通过小例子讲解:
这个模式一般用在程序的步骤比较多,而且有固定的模式,固定的步骤,而每一步的实现又有多种情况,这是我们可以使用TemplateMethod模式。这样可以保证算法骨架的正确性,又将多态运用的非常好。
这里举个人一天要做的事情吧,假如一个人一天要有起床,吃饭,做事情,睡觉四个事项。
1,首先我们看模板类:
- /**
- * 模板方法设计模式中的“模板类”
- * 一般情况下模板类都是一个抽象类
- */
- public abstract class PersonDay {
- /**
- * 在模板方法中编写核心算法,这个算法是不会改变的,这个算法被子类继承,可以得到复用。
- * 模板方法的流程一般不让子类覆盖,不希望子类去重新定义核心算法,所以模板方法通常被final修饰
- */
- public final void day(){
- doGetUp();
- doEatBreakfast();
- doSome();
- doSleep();
- }
- //将行为的具体实现延迟到子类中完成,达到不同的实现效果。
- public abstract void doGetUp();
- public abstract void doEatBreakfast();
- public abstract void doSome();
- public abstract void doSleep();
- }
2,我们来看学生类:
- public class StudentDay extends PersonDay{
- //学生起床
- public void doGetUp(){
- System.out.println("学生起床了,准备上学了")
- }
- //吃早餐
- public void doEatBreakfast(){
- System.out.println("学生吃早餐:牛奶、面包");
- }
- //上学
- public void doSome(){
- System.out.println("学生上课学习");
- }
- //睡觉
- public void doSleep(){
- System.out.println("学生做完功课睡觉");
- }
- }
3,我们来看老师类:
- public class StudentDay extends PersonDay{
- //老师起床
- public void doGetUp(){
- System.out.println("老师起床了,安顿好家人,准备到学校工作")
- }
- //吃早餐
- public void doEatBreakfast(){
- System.out.println("老师早餐:小米粥、油条");
- }
- //教学
- public void doSome(){
- System.out.println("老师上课教学");
- }
- //睡觉
- public void doSleep(){
- System.out.println("老师备完功课睡觉");
- }
- }
其它子类…………
4,看一下测试类,非常简单:
- public class Test {
- public static void main(String[] args) {
- //父类指向子类
- PersonDay d1 = new StudentDay();
- d1.day();
- PersonDay d2 = new WorkerDay();
- d2.day();
- }
- }
- </span>
分析总结:这样我们就利用模板方法完成了这个实例,我们来分析其中的特点吧:
1,将不变的核心算法行为搬移到了父类,去除了子类中的重复代码,并保证了算法的正确性,因为就在父类中写了一次。
2,具体步骤的下放,使多态体现了其中的优势,使代码的扩展性更高!
四,应用:
大家都知道在我们编写Servlet之前需要我们将之在web.xml中进行配置,这样我们才能在jsp向Servlet中传递数据,并从之获取数据,才能完成我们网页的动态显示。但是随着功能的增多,Servlet的增多,就需要我们为每个Servlet进行配置,这样有两个缺点:1,不断的进行web.xml文件配置不仅麻烦而且会使其容量越来越大,负载也会变大;2,每个servlet需要我们继承HttpServlet,这样耦合性比较高。为了解决此,我们这里可以使用模板方法进行解决。
如果根据数据库中的表进行分类的话,我们一般对表的操作可以分成增删改查,四种操作,这里我们进行上移,看模板类:
- /**
- * 模板类,以后编写的servlet类需要继承这个类,而不是httpservlet类了
- * @author Administrator
- */
- public abstract class CommonServlet extends HttpServlet {
- @Override
- //模板方法,定义了算法
- protected void service(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //获取执行的类型
- String operationType=request.getParameter("operationType");
- //判断
- if("insert" .equals(operationType)){
- doInsert(request,response);
- }else if("select".equals(operationType)){
- doSelect(request,response);
- }else if("update".equals(operationType)){
- doUpdate(request,response);
- }else{
- //.......................
- }
- }
- //抽象方法,都需要实现
- protected abstract void doInsert(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
- protected abstract void doSelect(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
- protected abstract void doUpdate(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
- }
- </span>
当然那些增删改查的的servlet就需要继承这个类了:
- public class AuthServlet extends CommonServlet {
- private IAuthService authService=new AuthServiceImpl();
- @Override
- protected void doInsert(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- //根据不同的表插入方法的具体实现
- }
- @Override
- protected void doSelect(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- //根据不同表查询方法的具体实现
- }
- @Override
- protected void doUpdate(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- //根据表的不同,更新方法的具体实现。
- }
- }
- </span>
这里注意我们在jsp页面进行相关功能时,需要我们将operationType执行的类别传过来,方便我们顶层Servlet的判断。这个就是框架抽象的很小很小的一步,但是对于这个模版方法阐释的也是很好的。
java设计模式(9):模板方法模式(TemplateMethod)的更多相关文章
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- Java设计模式应用——模板方法模式
所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...
- Java设计模式之模板方法模式(Template Method)
一.含义 定义一个算法中的操作框架,而将一些步骤延迟到子类中.使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现. 二 ...
- Java设计模式之模板方法模式(Template)
前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...
- java设计模式之模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...
- 从西天取经的九九八十一难来看Java设计模式:模板方法模式
目录 示例 模板方法模式 定义 意图 主要解决问题 适用场景 优缺点 西天取经的九九八十一难 示例 当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤, 但一些步骤,不同的子类有不同的行 ...
- 设计模式之模板方法模式 templateMethod
代码实现 public abstract class BankTemplateMethod { //具体方法 public void takeNumber(){ System.out.println( ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 图解Java设计模式之模板模式
图解Java设计模式之模板模式 豆浆制作问题 模板方法模式基本介绍 模板方法模式原理类图 模板方法模式解决豆浆制作问题 模板方法模式的钩子方法 模板方法模式在Spring框架中的源码分析 模板方法模式 ...
随机推荐
- 003.kubernets对于namespace的管理
一 Kuberbetes的架构简单介绍 1.1 云计算的传统分类 1.2 kubernetes基础架构 工作机制 用户通过kubectl向api-server提交需要运行的pod描述 api-serv ...
- 03丨认识文档数据库MongoDB
- Python for循环 - Python零基础入门教程
目录 一.for 循环语法 二.for 循环实战 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python ...
- Python将PDF转为TXT
PDFMiner----python的PDF解析器和分析器 1.官方文档:http://www.unixuser.org/~euske/python/pdfminer/index.html 2.特征 ...
- GO语言异常处理02---返回错误
package main import ( "errors" "fmt" "math" ) /*计算圆面积,同时返回[结果-错误对]*/ f ...
- 英特尔 i5-9400F,或将成为本年最高性价比的游戏处理器
英特尔 i5-9400F,或将成为本年最高性价比的游戏处理器 一直以来,每一代英特尔 i5 系列都是很多游戏玩家主要的选购对象,它和任何一款显卡似乎都能够很好的搭配起来.可凡事都有美中不足的地方,比如 ...
- Android adb的常用命令
环境部署: 1.下载adb工具 2.下载奇兔刷机(或其它一键刷机软件),将手机与电脑进行连接 3.一键root手机 命令 1.获取设备列表及设备状态:adb devices 如果连接的设备不止一个, ...
- 导出 Excel 模板自动生成规则,避免用户来回修改
一句话总结 Excel 导出.导入时,根据注解自动添加单元格验证规则,避免用户因填写错误的枚举字段而反复修改 Excel 需求背景 对于 Java Web 项目,总是不可避免的出现 Excel 导入. ...
- 提高GUI自动化测试稳定性解决方案
针对"GUI自动化测试稳定性问题"这个问题,最典型的情景就是:同样的测试用例,在同样的测试执行环境下,测试的结果有时是Success,有时是Fail,这严重降低了GUI测试的可信度 ...
- 07:JS(03)
BOM与DOM操作 # 截至目前为止 我们虽然已经学会了js语法 但是你会发现跟浏览器和html文件还是一点关系没有 """ BOM 浏览器对象模型 Browser Ob ...
