java设计模式之模板方法模式

   java学习到一定阶段,设计模式是绕不开得东西,下面来简单聊下java23种设计模式之一的模板方法模式。

  模板方法模式从定义上来说就是定义一个模板结构,将具体内容延迟到子类去实现。主要的作用就是在不改变模板结构的前提下在子类中重新定义模板中的内容。再用通俗一点的话讲,就是在父类里定义出一步一步要干什么,如果这一步书固定的,父类就是具体的实现方法,每个子类有不同的实现的方法就在父类中定义出抽象方法,父类中规定一步一步要干什么就是通过定义一个方法来按顺序掉用这些抽象或具体的方法。下面以一个我以前做过的业务来具体说明这个模板方法模式是如何使用的。

  首先,业务场景如下,我们有一系列的短任务,他们的业务都是1,创建目录,2,从数据中心下载文件,3调用第三方组件完成分析,4,处理分析结果,5删除目录。

package com.example.demo;

import java.io.File;
import java.io.IOException;
import java.util.Random;

public abstract class BaseTask {

    private static  String rootPath = "/home/test/";
    private int random = new Random().nextInt(1000000000);

    public void excute(String json) throws IOException {
        createFilePath();
        uploadFile(json);
        deal();
        dealResult();
        if(isDelete()){
            deleteFilePath();
        }
    }

    private final void createFilePath() throws IOException {
        new File(rootPath+random).createNewFile();
    }

    abstract void uploadFile (String json);

    abstract void deal();

    abstract void dealResult();

    private final void deleteFilePath() throws IOException {
        new File(rootPath+random).delete();
    }

    protected boolean isDelete()
    {
        return true;
    }
}

其中excute就是模板方法,规定了一系列行为的先后顺序,createFilePath和deleteFilePath2个方法的处理业务是不变的,所以将其私有化,并且子类不可继承,中间的3个方法每个任务实现不同,所以使用抽象方法使得子类必须重写。特别注意isDelete这个方法,这种类型的方法被称为钩子方法。其作用1、让子类实现算法中的可选部分。算法中的某些步骤是可选的,子类可以做出决定是否需要这些步骤。2、如果钩子对于子类的实现不重要时,子类可以对钩子置之不理。

  然后我们要扩展具体实现只需继承baseTask这个类就行了。

  总的来说,模板方法模式有以下三个好处

  • 1、提高代码复用性 
    将相同部分的代码放在抽象的父类中
  • 2、提高了拓展性 
    将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
  • 3、实现了反向控制 
    通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
posted @ 2018-11-11 23:47  yao_1  阅读(184)  评论(0编辑  收藏  举报