当我们遇到的业务逻辑具有大致相同的方式的时候,我们也许就该将这个业务逻辑抽象出来,采用模板方法,来进行封装我们的代码,提高代码的重用性,以及可维护性。下面是我的一个复习用的案例:

第一步:我们需要一个抽象出来的父类,其要实现的就是我们这个业务逻辑的大致的雏形,需要注意的是里面有一个”钩子“方法,用于定制子类的特有的活动方式:

package Template;

/**
 * 抽象基类,为其所有的子类提供以一个算法框架
 *
 * @author Tiger
 *
 */
public abstract class AbstractSubClass {

    /*
     * 模板方法,封装了所有子类索要共同进行遵循的算法框架
     */
    public final void prepareTemplateMethod() {// final修饰,避免子类对其重写
        // 步骤1
        Step1();
        // 步骤2
        Step2();
        // 步骤3
        Step3();

        if(isCustom()){//钩子概念,当为真的时候就会调用步骤四方法
            // 步骤4
            Step4();
        }
    }

    /**
     * 包访问权限,只有在同一个包内的类才能够被访问
     * @return
     */
    protected boolean isCustom() {
        // TODO Auto-generated method stub
        return false;
    }

    // 由于接下来的子类中对该方法的操作不一样,所以声明为抽象的方法,以便于“多态”的实现
    protected abstract void Step4();

    /**
     * 基本方法,步骤3
     */
    private void Step3() {
        System.out.println("步骤3");
    }

    // 由于接下来的子类中对该方法的操作不一样,所以声明为抽象的方法,以便于“多态”的实现
    protected abstract void Step2();

    /**
     * 基本方法,步骤一
     */
    private void Step1() {
        System.out.println("步骤一");
    }
}

然后我们可以创建第一个子类:

package Template;

/**
 * 这是第一个抽象类的子类,里面有只适合这一个类的方法的实现
 * @author Administrator
 *
 */
public class SubClassOne extends AbstractSubClass {

    @Override
    protected void Step4() {
        // TODO Auto-generated method stub
        System.out.println("第一个子类的专属的步骤4");
    }

    @Override
    protected void Step2() {
        // TODO Auto-generated method stub
        System.out.println("第一个子类的专属的步骤2");
    }

    @Override
    protected boolean isCustom() {
        // TODO Auto-generated method stub
        return true;//此处是在子类中,"钩住"了父类的方法,实现了自定义的方式
    }

}

然后是第二个子类,其实和第一个类大致相同,仅仅是某些方法内的逻辑代码不一致而已。

package Template;

/**
 * 这是第一个抽象类的子类,里面有只适合这一个类的方法的实现
 * @author Administrator
 *
 */
public class SubClassTwo extends AbstractSubClass {

    @Override
    protected void Step4() {
        // TODO Auto-generated method stub
        System.out.println("第二个子类的专属的步骤4");
    }

    @Override
    protected void Step2() {
        // TODO Auto-generated method stub
        System.out.println("第二个子类的专属的步骤2");
    }

    @Override
    protected boolean isCustom() {
        // TODO Auto-generated method stub
        return false;//此处是在子类中,"钩住"了父类的方法,实现了自定义的方式
    }

}

好了,接下来就是测试要用的类了:

package Template;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("第一个子类开始了");
        AbstractSubClass sub1=new SubClassOne();//其实这就是多态的实现
        sub1.prepareTemplateMethod();
        System.out.println("第一个子类的实现过程结束了");
        System.out.println("-------------------------------------");
        System.out.println("第二个子类开始了");
        AbstractSubClass sub2=new SubClassTwo();//同样的,其实这就是多态的实现
        sub2.prepareTemplateMethod();
        System.out.println("第二个子类的实现过程结束了");
        System.out.println("-------------------------------------");
    }

}

下面就是我们的程序的运行结果:

第一个子类开始了
步骤一
第一个子类的专属的步骤2
步骤3
第一个子类的专属的步骤4
第一个子类的实现过程结束了
-------------------------------------
第二个子类开始了
步骤一
第二个子类的专属的步骤2
步骤3
第二个子类的实现过程结束了
-------------------------------------

我们可以看出,使用了钩子方法的类就会调用相关的方法,结果我们就得到了不一样的运行结果。其实这就是多态的另一种展现形式。

总结:模板方法优点很多,但是也由于是继承的关系,所以会导致子类继承的时候有些问题。大致的实现步骤是,先抽象出来一个大致实现了所有方法的父类,然后对相关的方法进行抽象处理,让子类对其进行逻辑代码的实现,这样大大的增加了程序的灵活性。然而最经典上的事我们的钩子方法,其使得用户可以自定义的真正实现,使得我们的代码更加精致。

好了,java模式中的模板模式,大致就是这样了。

Java模式之模板方法模式的更多相关文章

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

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

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

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

  3. Android设计模式之命令模式、策略模式、模板方法模式

    命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...

  4. 简介Python设计模式中的代理模式与模板方法模式编程

    简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...

  5. java模式之-模板方法模式

    模板方法模式是java设计模式常见的模式之一. <JAVA与模式>中写道: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法 ...

  6. Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  7. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  8. Java抽象类应用—模板方法模式

    模板方法模式(Templete method) 定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中,模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤. 例: ...

  9. Java设计模式应用——模板方法模式

    所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...

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

    一.含义 定义一个算法中的操作框架,而将一些步骤延迟到子类中.使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现. 二 ...

随机推荐

  1. MFC回车事件

    这是一个使用MFC开发关于设备控制的windows应用程序 通过该项目我学到的内容: 继承的好处 应用程序的界面是与应用程序的代码有一定的对应关系的,界面中不同的控件对应不同的类,首先就是需要一个对话 ...

  2. 保留键的情况下取字典中最大的值(max\zip函数的联合使用)

    在我们平常想要获取字典中value最大或者最小的值的时候,常常使用如下函数: testDict = {"age1":18,"age2":20,"age ...

  3. Python练习之pillow

    此系列意在记录于一些有趣的程序及对其的总结. 问题来源: https://github.com/Yixiaohan/show-me-the-code https://github.com/HT524/ ...

  4. let 和 const 命令

    let 命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a / ...

  5. iOS开源照片浏览器框架SGPhotoBrowser的设计与实现

    简介 近日在制作一个开源加密相册时附带着设计了一个照片浏览器,在进一步优化后发布到了GitHub供大家使用,该框架虽然没有MWPhotoBrowser那么强大,但是使用起来更为方便,操作更符合常规相册 ...

  6. how to output quotes in bash prompt

    introduction In certain situations, quotes are required to be output in the command prompt. To do th ...

  7. High Executions Of Statement "delete from smon_scn_time..."

    In this Document   Symptoms   Cause   Solution APPLIES TO: Oracle Database - Enterprise Edition - Ve ...

  8. 2016年年终CSDN博客总结

    2015年12月1日,结束了4个月的尚观嵌入式培训生涯,经过了几轮重重面试,最终来到了伟易达集团.经过了长达3个月的试用期,正式成为了伟易达集团的助理工程师. 回顾一年来的学习,工作,生活.各种酸甜苦 ...

  9. shell编程--基本格式,基本语法,运算符,expr,(()),$[]

    02/shell编程 Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell Shell也是一门编程语言."."号执行脚本时,会让脚本在调用者 ...

  10. 阿里云手动安装特定版本的nginx

    想添加nginx的缓存功能, 结果1.4.6还不支持. apt-get remove nginx 374 sudo apt-key add nginx_signing.key 375 deb http ...