本篇博客的目录:

一:模板方法模式介绍

二:模板方法模式的简单实现

三:总结

一:模板方法模式的介绍

1.1:模板方法模式的定义

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

这句话的意思就是我们先定义一套固定的规则标准,然后让不确定的方法设置为抽象的,等到具体的实现时候,让子类再去实现。先设置好一套规则,定义好一套业务流程,再去具体实现。这就是模板方法。这和我们现实生活的许多做法有很多异曲同工之处,比如我们新职员入公司、去银行办理业务等等,它们都预先定制好了一套流程,我们要做的就是按照这个流程往下走,就可以完成这件事情。

1.2:结构以及介绍:

其中可以看到有一个抽象类,里面定义了几个操作方法和一个模板方法,然后具体的子类再去继承这个类,实现父类中尚未实现的方法。这其中还涉及一个概念,钩子方法,也称作回调函数(这个概念在jdbcTempalte中很常见).它的提出和模板方法设计的精髓很很大关联,抽象类中的抽象方法就是钩子,我们需要哪个挂哪个,再具体的去实现。其中父类具有绝对的控制整体流程的权力,而子类不影响整体架构,它只是实现细节,并不起主导作用。如果我们要在父类中实现的业务逻辑,我们可以把它设置为private的,这样对子类就隐匿了,它根本无法实现。

1.3:简单代码实现

为了让这个更具有说服力,我们来模拟一个流程,公司招聘新员工的业务流程。假如我现在要去公司应聘啦,公司肯定预先定制好了一套流程,我们用代码来仿照一下这个流程:

1.3.1:Company这个类定义为抽象类,我们预定了一系列的求职流程,求职者投递简历,决定是否通过,这里属于具体的实现细节,交给子类去实现。如果通过才能继续下面的流程,否则无法通过。然后就是会见求职者,笔试-面试,公司是否能让该求职者通过属于具体的子类实现细节,所以定义抽象方法isAccess(),只有在考虑录用的情况下才会发放offer,一下是流程图:

我们采用模板设计模式,通过代码来模拟实现一下:

public abstract class   Company {

    public  static   int  score1=0;
public static int score2=0; public void TemplateMethod(Jober jober){ if (Isreceive(jober)){ viewJober(jober); examination1(jober); examination2(jober); if (isAccess(jober)){
offer(jober);
}else {
System.out.println("很遗憾"+jober.getName()+"尚未通过本公司面试");
} }else {
System.out.println(jober.getName()+"的简历不合格");
} } /**
* 是否接受简历
* @return
*/
public abstract boolean Isreceive(Jober jober); /**
* 会见求职者
* @param jober
*/
public void viewJober(Jober jober){ System.out.println("面试者会见求职者"+jober.getName());
} /**
*笔试
* @param jober
* @return
*/ public int examination1(Jober jober){ score1= jober.exam1(); return score1;
} /**
* 面试
* @param jober
* @return
*/
public int examination2(Jober jober){
score2 = jober.exam2();
return score2;
}
/**
* 考虑求职者是否能进入公司
* @param jober
* @return
*/
public abstract boolean isAccess(Jober jober);
/**
* 发放offer
* @param jober
*/
public void offer(Jober jober){ System.out.println("恭喜"+jober.getName()+"通过本公司的面试,现在发布offer"); } }

1.3.2:我们来定义一个具体的子类,去实现公司求职这个抽象父类,重写他的抽象方法,实现自己的逻辑:

public class AiLBaba extends Company {

    @Override
public boolean Isreceive(Jober jober) { if ("Yrion".equals(jober.getName())) {
System.out.println(jober.getName() + "通过本公司简历筛选");
return true;
}else return false;
} @Override
public boolean isAccess(Jober jober) {
if (score1+score2 > 150)
return true;
return false;
}
}

可以看到,我们只需要继承抽象的方法就行,这里的具体实现逻辑自己来决定,而整个求职过程不会变更,这也是模板方法的主要原则:

1.3.3 我们来定义一个求职者对象,主要作用就是调用求职公司的模板方法,发起一个流程:

public class Jober {

    private String name;

    public void setName(String name) {
this.name = name;
} public String getName() { return name;
} public int exam1() { System.out.println(name + "正在笔试..."); return 88;
} public int exam2() { System.out.println(name + "正在面试..."); return 90;
} public void getJob(Company company){ company.TemplateMethod(this); } }

1.3.4:根据现实的规则,求职者应该是主动发起的,我们通过getJob方法向公司发起求职动作,公司已经预设好一系列的流程了,进而转为我们预先设计的模板流程中。好了,我们来建个测试类,运行这个小demo,看一下结果如何:

public class Test {

    public static void main(String[] args) {

        Company aLi =new AiLBaba();

        Jober jober=new Jober();

        jober.setName("Yrion");

        jober.getJob(aLi);

    }
}

运行结果如下:

Yrion通过本公司简历筛选
面试者会见求职者Yrion
Yrion正在笔试...
Yrion正在面试...
恭喜Yrion通过本公司的面试,现在发布offer

我们再来做个测试,假如尚未通过简历初选:

public class Test {

    public static void main(String[] args) {

        Company aLi =new AiLBaba();

        Jober jober=new Jober();

        jober.setName("周星星");

        jober.getJob(aLi);

    }
}

运行结果如下:

周星星的简历不合格

我们再来测试一下,假如简历通过,但是笔试面试尚未通过,只需要改这两处代码就行了:

public int exam1() {

        System.out.println(name + "正在笔试...");

        return 60;
} public int exam2() { System.out.println(name + "正在面试..."); return 60;
}

我们再来测试一下:

Yrion通过本公司简历筛选
面试者会见求职者Yrion
Yrion正在笔试...
Yrion正在面试...
很遗憾Yrion尚未通过本公司面试

这个小实例就完成了,希望大家可以体会到模板方法的设计思想,进而将它运用到项目中去。这是个小实例,比较简单,接下来我们将会把目光转向更为复杂的Spring中的JDBCTemplate

三:总结

本篇博客讲解了Template设计模式,它的主要目标是减少工作量,把固定不变的步骤提取出来形成一个模板,然后具体的可变的部分再交给子类去实现,方便于日后的扩展,主要的适用性如下:

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • 控制子类扩展。模板方法只在特定点调用,这样就只允许在这些点进行扩展。

预告:下篇博客,将会深入了解JDBCTempalte的设计源码

模板方法模式和JDBCTemplate(一)的更多相关文章

  1. 设计模式——Spring IoC中用到的模板方法模式

    基本概念 什么是模板方法(Template method):父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现. 最大的好处:代码复用,减少重复代码.除了子类要实现的特定方法,其他方法及方法 ...

  2. 从模板模式到JdbcTemplate

    模板模式初探 关于模板模式,大家可以参阅 模板方法模式深度解析(一) 原始的jdbc 关于原始的jdbc,如下: import java.sql.Connection; import java.sql ...

  3. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  4. GOF23设计模式之模板方法模式(template method)

    一.模板方法模式概述 模板方法模式是编程中经常使用的模式.它定义了一种操作中的算法架构,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤. (1) ...

  5. Java设计模式之模板方法模式(Template)

    前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...

  6. 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)

    今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...

  7. 设计模式(十四)模板方法模式(Template Pattern)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

  8. C#设计模式-模板方法模式

    提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下 ...

  9. C#设计模式系列:模板方法模式(Template Method)

    你去银行取款的时候,银行会给你一张取款单,这张取款单就是一个模板,它把公共的内容提取到模板中,只留下部分让用户来填写.在软件系统中,将多个类的共有内容提取到一个模板中的思想便是模板方法模式的思想. 模 ...

随机推荐

  1. 如何利用vue和php做前后端分离开发?

    新手上路,前端工程师,刚毕业参加工作两个月,上面让我用vue搭建环境和php工程师一起开发,做前后端分离,然而我只用过简单的vue做一些小组件的经验,完全不知道怎样和php工程师配合,ps: php那 ...

  2. php 使用 ffmpeg 转换视频,截图,并生成缩略图

    http://blog.csdn.net/toss156/article/details/7003059 把ffmpeg 和  生成缩略图整合了一下. include("ImageResiz ...

  3. 虚拟主机,VPS,云主机之间的区别?

    虚拟主机即共享主机,是利用虚拟技术把一台完整的服务器分成若干个主机,拥有多个网站,共享这台服务器的硬件和带宽的资源.可以托管简单的静态和动态的网站,满足客户最基本的网络托管需求. VPS是将一台物理服 ...

  4. ecshop_标签大全

    admin 后台功能 -------templates后台模板 data 上传文件.SQL备份文件.配置项 ------sqldata 数据库备份文件 ------config.php配置文件 inc ...

  5. 基于 HTML5 WebGL 的 3D 仪表数据监控

    工控仪表重点发展基于现场总线技术的主控系统装置及智能化仪表.特种和专用自动化仪表:全面扩大服务领域,推进仪器仪表系统的数字化.智能化.网络化,完成 自动化仪表从模拟技术向数字技术的转变:推进具有自主版 ...

  6. Java反射(Reflection)

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

  7. linux如何安装java环境

    linux安装jdk7步骤: 1.首先使用命令查看linux系统版本号: lsb_release -a 11 2.下载对应的jdk版本,笔者使用的是jdk-7u79-linux-x64.tar.gz: ...

  8. [转]另一种遍历Map的方式: Map.Entry 和 Map.entrySet()

    转自: http://blog.csdn.net/mageshuai/article/details/3523116 今天看Think in java 的GUI这一章的时候,里面的TextArea这个 ...

  9. input===》name属性异常错误

    <input type="text" name="status" /> 使用springMVC时,如果有这个输入框,此框必须要填,且必须是数字,否者 ...

  10. CSS深入理解学习笔记之z-index

    1.z-index基础 z-index含义:指定了元素及其子元素的"z顺序",而"z顺序"可以决定元素的覆盖顺序.z-index值越大越在上面. z-index ...