20230421 10. 模板方法模式 - 试卷答题

发布时间 2023-06-19 09:46:21作者: 流星<。)#)))≦

既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理

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

模板方法模式

  • AbstractClass是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
  • ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。

模板方法模式就是提供了一个很好的代码复用平台

代码示例 - 试卷

模板类

public abstract class TestPaper {
    public void test1() {
        System.out.println("试题1");
        System.out.println("答案1:" + answer1());
    }

    protected abstract String answer1();

    public void test2() {
        System.out.println("试题2");
        System.out.println("答案2:" + answer2());
    }

    protected abstract String answer2();
}

具体子类

public class TestPaperA extends TestPaper {
    @Override
    public String answer1() {
        return "A";
    }

    @Override
    public String answer2() {
        return "A";
    }
}


public class TestPaperB extends TestPaper {
    @Override
    public String answer1() {
        return "B";
    }

    @Override
    public String answer2() {
        return "B";
    }
}

客户端

public class Test {
    public static void main(String[] args) {
        TestPaper studentA = new TestPaperA();
        studentA.test1();
        studentA.test2();

        System.out.println("-----------------------");

        TestPaper studentB = new TestPaperB();
        studentB.test1();
        studentB.test2();
    }
}