模板方法模式(TemplateMethod)

1

定义:

官方的定义:编写一个操作算法中的框架,而将这些步骤延迟加载到子类中。本质上就是固定算法框架。

通俗的说就是,某些程序的编写,开头和结尾是一样的,但是中间步骤却不太一样,因此我们可以将开头和结尾写死固定,然后单独编写中间步骤的代码。

举个通俗的例子:

一次随堂测验,对于每个学生而言:

考试前都需要为考试准备工具和了解自己的考场座位号。

考试时候的试卷也是一样的,但是每个人的答案却是不一样的。

考试结束后等待成绩所需要的流程也是一样的。

那么我们写一个抽象类,可以将 “考前准备” 和“ 考试后流程” 以及 “试卷构造过程“ 都剥离出来形成模板方法,填写答案这个步骤则做成抽象方法。学生作为子类继承父类后,只需要重新实现 “填写答案” 这个方法即可。

 

2

模板方法结构

模板方法模式(TemplateMethod)_第1张图片

 

 就如图,模板方法模式主要就是两种类——抽象类和具体子类

 抽象类:

   在抽象类中定义了一系列的操作differentMethod,每个操作可以使具体的,也可以是抽象的,每个操作对应一个算法的步骤,在子类中可以重新定义或实现这些步骤。TmplateMethod()这个方法用于定义一个算法结构,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。

  具体子类:
  主要是完成在抽象类(父类)里面声明的抽象方法,若有必要,也可以覆盖在父类中已经实现的具体操作。
 
3
实例(代码)
 
首先是抽象类ExamPaper,它对应的这是之前的例子中对于每一位考生都是一样的流程部分,如考前准备等等。但是每个答案的部分却声明为抽象方法,需要子类(学生)去一一实现。同时也用final修饰方法ShowExam()方法将考试流程限定。
public abstract class ExamPaper {

    public final void ShowExam() {
        readyForExam();
        FirstQuestion();
        SecondQuestion();
        ThridQuestion();
        FourQuestion();
        finishExam();
    }

    public static void log (String info) {
        System.out.println(info);
    }

    public void readyForExam() {
        log ("read for exam");
    }

    public void FirstQuestion() {
        log ("this answer of first is " + FirstAnswer());
    }

    public void SecondQuestion() {
        log ("this answer of second is " + SecondAnswer());
    }

    public void ThridQuestion() {
        log ("this answer of third is " + ThirdAnswer());
    }

    public void FourQuestion() {
        log ("this answer of four is " + FourAnswer());
    }

    public void finishExam() {
        log ("exam end");
    }



    public abstract String FirstAnswer();
    public abstract String SecondAnswer();
    public abstract String ThirdAnswer();
    public abstract String FourAnswer();
}

其次是两位同学类的具体实现,可以看到我们没必要再去编写考前准备、考试后的处理等方法,我们只需要实现 “填写答案” 这部分方法即可。

public class Xiaohong extends ExamPaper {

    @Override
    public String FirstAnswer() {
        return "first answer for Xiaohong";
    }

    @Override
    public String SecondAnswer() {
        return "second answer for Xiaohong";
    }

    @Override
    public String ThirdAnswer() {
        return "thrid answer for Xiaohong";
    }

    @Override
    public String FourAnswer() {
        return "four answer for Xiaohong";
    }

}
public class Xiaoming extends ExamPaper {

    @Override
    public String FirstAnswer() {
        return "first answer for Xiaoming";
    }

    @Override
    public String SecondAnswer() {
        return "second answer for Xiaoming";
    }

    @Override
    public String ThirdAnswer() {
        return "thrid answer for Xiaoming";
    }

    @Override
    public String FourAnswer() {
        return "four answer for Xiaoming";
    }
}

运行代码:

public class MiddleExam {

    public static void main(String[] args) {
        Xiaoming xm = new Xiaoming();
        Xiaohong xh = new Xiaohong();
        xm.ShowExam();
        xh.ShowExam();
    }
}

 

结果:

模板方法模式(TemplateMethod)_第2张图片

 

 

 

4

总结:

模板方法模式的存在使得代码便于维护和易于扩展,同时也比较灵活。它将一些子类共有的、逻辑相同的方法剥离出来,作为模板方法。从而子类就只需要实现不同的部分。

 

就比如编写一个闯关游戏的背景代码部分,不同的关卡是不同的,但是每张背景的加载流程都是一样的吧?

那我们就可以把图片获取这一部分制作成抽象类,然后其余的加载图片、设置宽高、渲染部分方法写死,这样每次我们编写不同的场景都只需要实现图片获取这一方法即可。

假如某些场景变化了我们也可以覆盖父类的相应部分方法以适应这些变化。

从而可以让我们省去很多机械劳动——编写重复的代码。

你可能感兴趣的:(模板方法模式(TemplateMethod))