模板方法模式和JDBCTemplate(一)

本篇博客的目录:

一:模板方法模式介绍

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

三:总结

一:模板方法模式的介绍

1.1:模板方法模式的定义

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

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

1.2:结构以及介绍:

其中可以看到有一个抽象类,里面定义了几个操作方法和一个模板方法,然后具体的子类再去继承这个类,实现父类中尚未实现的方法。这其中还涉及一个概念,钩子方法,也称作回调函数(这个概念在jdbcTempalte中很常见).它的提出和模板方法设计的精髓很很大关联,抽象类中的抽象方法就是钩子,我们需要哪个挂哪个,再具体的去实现。

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的设计源码

时间: 2024-10-30 12:58:11

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

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

基本概念 什么是模板方法(Template method):父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现. 最大的好处:代码复用,减少重复代码.除了子类要实现的特定方法,其他方法及方法调用顺序都在父类中预先写好了. 所以父类模板方法中有两类方法: 1.共同的方法:所有子类都会用到的代码 2.不同的方法:子类要覆盖的方法,分为两种: A.抽象方法:父类中的是抽象方法,子类必须覆盖 B.钩子方法:父类中是一个空方法,子类继承了默认也是空的 注:为什么叫钩子,子类可以通过这个钩子(方法

JAVA设计模式(17):行为型-模板方法模式(Template Method)

场景 客户到银行办理业务: 取号排队 办理具体现金/转账/企业/个人/理财业务 给银行工作人员评分 核心: 处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用工厂方法模式,,将这个节点的代码实现转移给子类完成. 即:处理步骤父类中定义好,具体实现延迟到子类中定义. 概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑

模板方法模式(Template Method)

一.模板方法模式介绍 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的 某些特定步骤. 核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用工厂方法模式,将这个节点的代码实现转移给 子类完成.即:处理步骤在父类中定义好,具体的实现延迟到子类中定义. 说白了,就是将一些相同操作的代码,封装成一个算法的骨架.核心的部分留在子类中操作,在父类中只把那些骨架做好. 例如: 1.去银行办业务,银行

设计模式学习笔记之九:模板方法模式

现在我家里有一台铃木的小车锋驭和一台铃木的摩托车风暴1000,我要想把这两种类型的车都先跑起来再停下来,有一些步骤,并且这些步骤是有先后顺序的,那就是: 1. 打开车门 2. 启动发动机 3. 挂档 4. 走起 5. 刹车 6. 停车 OO设计原则之一就是分离可变和不变的部分并把可变的部分封装起来,我们来看一下以上两种类型的车,哪些步骤的实现是一样的,哪些是可变的.我们把不变的部分提取出来并放到超类中让所有子类共享其行为,同时我们把可变部分的具体实现延迟到子类中,让子类来自行决定如何实现. 1.

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

一.模板方法模式概述 模板方法模式是编程中经常使用的模式.它定义了一种操作中的算法架构,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤. (1)核心:   处理某个流程的代码已经都定义好了,但是其中某个节点的代码暂时不能确定,因此,采用模板方法模式,将这个节点的代码转移到子类完成. 即:处理步骤在父类中定义好,具体实现延迟到子类中定义. (2)什么时候采用模板方法模式?   实现一个算法,整体步骤很固定,但是,某些部分需要经常改变,所以把这

JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来聊聊final这个关键字 final可以修饰类,方法和变量 final修饰的类不可以被继承 final修饰的方法不可以被覆盖 final修饰的变量是一个常量,只能被赋值一次 内部类只能访问被final修饰的局部变量 final,故名思意,就是最终的意思,由以上的五种特性,不过final的出现,也是有

《JavaScript设计模式与开发实践》读书笔记之模板方法模式

1. 模板方法模式 1.1 面向对象方式实现模板方法模式 以泡茶和泡咖啡为例,可以整理为下面四步 把水煮沸 用沸水冲泡饮料 把饮料倒进杯子 加调料 首先创建一个抽象父类来表示泡一杯饮料 var Beverage=function(){}; Beverage.prototype.boilWater=function(){ console.log('把水煮沸'); }; Beverage.prototype.brew=function(){};//空方法,由子类重写 Beverage.prototy

面向对象编程思想-模板方法模式

一.引言 说到模板,顾名思义:就是样板,整体架构已经有了,你只需要填充自己的特定内容就可以了.如:简历模板,论文模板,PPT模板等 在软件设计中,模板方法模式与之很相似,下面请看我们今天要学习的模板方法模式 二.模板方法模式 定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 下面结构图: 抽象模板角色(AbstractClass):在抽象类中定义一个或多个基本操作,每一个操作对应算法中一个步骤:同时提供一个模板方法

(九)模板方法模式

  转载:http://www.cnblogs.com/zuoxiaolong/p/pattern10.html 模板方法模式,这是一个在许多优秀的开源项目中LZ见的最多的一个设计模式,也是LZ觉得最为优秀的一个设计模式,所以这一章LZ会尽自己所能的去尽量将这个设计模式解释清楚. 模板方法模式,一般是为了统一子类的算法实现步骤,所使用的一种手段或者说是方式.它在父类中定义一系列算法的步骤,而将具体的实现都推迟到子类. 最典型的形式就是一个接口,一个抽象父类,父类中会有一系列的抽象方法,而在子类中