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

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

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. Java面试06|项目相关介绍

    1.明确你的项目到底是做什么的,有哪些功能 广告投放机:项目主要是为移动端有针对性的进行广告展示. 媒体管理平台SSP:为媒体端实现多种变现途径 (1)广告投放机中关于广告检索与排序的功能 1.广告检 ...

  2. jQuery – AJAX load() 方法

    jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selector). ...

  3. 安卓高级 WebView的使用到 js交互

    我们先来学习 怎么使用再到用js和安卓源生方法交互 WebView简单使用 此部分转载并做了补充 原博客 原因:比较简单不是很想在写,我只要写js交互部分 WebView可以使得网页轻松的内嵌到app ...

  4. 安卓高级 特效动画ExplosionField和 SmoothTransition

    本教程所有图片为github上的所无法正常访问请科学上网 SmoothTransition 展示效果 github:源码地址 使用方法 你能通过一行代码使用上面所有的动画 @Override prot ...

  5. TensoFlow实现条件语句

    import tensorflow as tf a = tf.constant(20) b = tf.constant(10) result1 = tf.cond(a > b, lambda: ...

  6. (Java)微信之个人公众账号开发(二)——接收并处理用户消息(下)

    接下来,我们再讲一下图文消息: 如图: 大家可以先从开发者文档中了解一下图文消息的一些参数: 如上图,用户回复4时,ipastor返回了几条图文消息,上图中属于多图文消息,当然还有单图文消息,图文消息 ...

  7. git中status指令总是提示内容被修改的解决

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在用git提交项目修改时发现一个问题,就是多次 git a ...

  8. SQLite Insert 语句(http://www.w3cschool.cc/sqlite/sqlite-insert.html)

    SQLite Insert 语句 SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行. 语法 INSERT INTO 语句有两种基本语法,如下所示: INSERT IN ...

  9. JAVA面向对象-----内部类的概述

    JAVA面向对象-–内部类的概述s 将类定义在另一个类的内部则成为内部类.其实就是类定义的位置发生了变化. 在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为 ...

  10. GC垃圾回收算法

    什么是GC垃圾回收呢.日常生活中我们去餐厅吃饭吃完饭,吃完饭走了餐具不用管,服务员在把餐具拿走,这是一种方式,服务员怎么知道他要来把餐具拿走呢,因为你走了,这个位置空了.服务员什么时候拿走餐具很重要, ...