模板方法模式

模板方法

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

模板方法结构图

模板方法模式

模板方法实现

/**
 * 假设本题是以考生答试卷为背景,对于考生而言,是不需要去抄试卷的,只是需要去写对应每个题目的答案
 * 即可。那么我们把试卷给抽取出来,学生只是需要去写出答案即可
 * */

TestPaper class

​
/**
 * @className:TeatPaper
 * @Description: 定义模板方法
 * @Date:2018/10/13 16:39
 */
abstract class TestPaper {
    public void test1(){
        System.out.println("“大煮干丝”是哪个菜系的代表菜之一( )。" + "A四川菜系 B山东菜系 C广东菜系 D淮扬菜系");
        System.out.println(answer1());
    }
    /**
     * 给出问题1的答案
     * @return 返回学生所给的答案
     * */
    abstract public String answer1();
​
    public void test2(){
        System.out.println("红茶属于( )茶。\n" +
                "A半发酵 B发酵 C不发酵 D微发酵");
        System.out.println(answer2());
    }
    /**
     * 给出问题2的答案
     * @return 返回学生所给的答案
     * */
    abstract public String answer2();
​
    public void test3(){
        System.out.println("满汉全席起兴于( )。\n" +
                "A清代 B唐代 C宋代 D两汉");
        System.out.println(answer3());
    }
    /**
     * 给出问题3的答案
     * @return 返回学生所给的答案
     * */
    abstract public String answer3();
}

StudentA Class

/**
 * @className:StudentA
 * @Description: 学生A所给的答案
 * @Date:2018/10/13 16:55
 */
public class StudentA extends TestPaper {
    @Override
    public String answer1() {
        return "A";
    }
​
    @Override
    public String answer2() {
        return "B";
    }
​
    @Override
    public String answer3() {
        return "A";
    }
}

StudentB class

/**
 * @className:StudentB
 * @Description: 学生B所给的答案
 * @Date:2018/10/13 16:56
 */
public class StudentB extends TestPaper {
    @Override
    public String answer1() {
        return "B";
    }
​
    @Override
    public String answer2() {
        return "C";
    }
​
    @Override
    public String answer3() {
        return "A";
    }
}

Client Class

/**
 * @className:Client
 * @Description: 客户端
 * @Date:2018/10/13 16:57
 */
public class Client {
    public static void main(String[] args) {
        //将子类变量的声明改成了父类,利用了多态性,实现了对代码的复用
        TestPaper studentA=new StudentA();
        studentA.test1();
        studentA.test2();
        studentA.test3();
​
        TestPaper studentB=new StudentA();
        studentB.test1();
        studentB.test2();
        studentB.test3();
    }
}

小结

模板方法总体来说还是比较简单的,理解好定义即可理解模板方法的精髓。