万恶的考试模版方法模式

1.不同学生ab做题除了答案不同,其他都一样如下:
试卷类:

/**
 * @author dxy
 * @version 1.0
 * @date 2021/10/24 18:10
 * @decripton 试题
 * @mail victorydeng@163.com
 */
public class ExamPaper {
    public void question1() {
        System.out.println("以下不是四大名著的是:a 红楼梦 b 西游记 c 三国演义 d 牡丹亭");
    }

    public void question2() {
        System.out.println("以下不是四大发明的是:a 火药 b 造纸术 c 雷达 d 指南针");
    }

    public void question3() {
        System.out.println("以下不是四大文明古国的是:a 古巴比伦 b 古埃及 c 中国 d 希腊");
    }
}

学生a的试卷:

/**
 * @author dxy
 * @version 1.0
 * @date 2021/10/24 18:16
 * @decripton 学生a的试卷
 * @mail victorydeng@163.com
 */
public class StudentAsPaper extends ExamPaper {
    @Override
    public void question1() {
        super.question1();
        System.out.println("学生a的答案:a");
    }

    @Override
    public void question2() {
        super.question2();
        System.out.println("学生a的答案:a");
    }

    @Override
    public void question3() {
        super.question3();
        System.out.println("学生a的答案:a");
    }
}

学生B的试卷:


/**
 * @author dxy
 * @version 1.0
 * @date 2021/10/24 18:18
 * @decripton 学生b的试卷
 * @mail victorydeng@163.com
 */
public class StudentBsPaper extends ExamPaper {
    @Override
    public void question1() {
        super.question1();
        System.out.println("学生b的答案:b");
    }

    @Override
    public void question2() {
        super.question2();
        System.out.println("学生b的答案:b");
    }

    @Override
    public void question3() {
        super.question3();
        System.out.println("学生b的答案:b");
    }
}

测试方法:

/**
 * @author dxy
 * @version 1.0
 * @date 2021/10/24 18:23
 * @decripton 测试方法
 * @mail victorydeng@163.com
 */
public class Test {
    public static void main(String[] args) {
        System.out.println("------学生a的试卷start-------");
        StudentAsPaper studentAsPaper = new StudentAsPaper();
        studentAsPaper.question1();
        studentAsPaper.question2();
        studentAsPaper.question3();
        System.out.println("------学生a的试卷end-------");

        System.out.println("------学生b的试卷start-------");
        StudentBsPaper studentBsPaper = new StudentBsPaper();
        studentBsPaper.question1();
        studentBsPaper.question2();
        studentBsPaper.question3();
        System.out.println("------学生b的试卷end-------");
    }
}

结果·:
在这里插入图片描述
可以看到a和b的类非常类似,除了答案不同,没什么不一样,这样写又容易错,又难以维护

2.模版方法模式
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
类图:
在这里插入图片描述

我们给ExamPaper类增加3个回答试题的抽象方法如下:

/**
 * @author dxy
 * @version 1.0
 * @date 2021/10/24 18:10
 * @decripton 试题
 * @mail victorydeng@163.com
 */
public abstract class ExamPaper {
    public void question1() {
        System.out.println("以下不是四大名著的是:a 红楼梦 b 西游记 c 三国演义 d 牡丹亭");
        System.out.println(this.answer1());

    }

    public void question2() {
        System.out.println("以下不是四大发明的是:a 火药 b 造纸术 c 雷达 d 指南针");
        System.out.println(this.answer2());
    }

    public void question3() {
        System.out.println("以下不是四大文明古国的是:a 古巴比伦 b 古埃及 c 中国 d 希腊");
        System.out.println(this.answer3());
    }

    public abstract String answer1();

    public abstract String answer2();

    public abstract String answer3();

}

修改后的studentA:

public class StudentAsPaper extends ExamPaper {
    @Override
    public String answer1() {
        return "学生a的答案:a";
    }

    @Override
    public String answer2() {
        return "学生a的答案:a";
    }

    @Override
    public String answer3() {
        return "学生a的答案:a";
    }


}

修改后的b的:

/**
 * @author dxy
 * @version 1.0
 * @date 2021/10/24 18:18
 * @decripton 学生b的试卷
 * @mail victorydeng@163.com
 */
public class StudentBsPaper extends ExamPaper {
    @Override
    public String answer1() {
        return "学生b的答案:b";
    }

    @Override
    public String answer2() {
        return "学生b的答案:b";
    }

    @Override
    public String answer3() {
        return "学生b的答案:b";
    }
}

测试:

/**
 * @author dxy
 * @version 1.0
 * @date 2021/10/24 18:23
 * @decripton 测试方法
 * @mail victorydeng@163.com
 */
public class Test {
    public static void main(String[] args) {
        System.out.println("------学生a的试卷start-------");
        ExamPaper studentAsPaper = new StudentAsPaper(); //利用多态 子类声明改成父类
        studentAsPaper.question1();
        studentAsPaper.question2();
        studentAsPaper.question3();
        System.out.println("------学生a的试卷end-------");

        System.out.println("------学生b的试卷start-------");
        ExamPaper studentBsPaper = new StudentBsPaper();
        studentBsPaper.question1();
        studentBsPaper.question2();
        studentBsPaper.question3();
        System.out.println("------学生b的试卷end-------");
    }
}

结果:
在这里插入图片描述
3.总结:
模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。模板方法模式就是提供了一个很好的代码复用平台。因为有时候,我们会遇到由系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但有些步骤的实现可能不同。这时候,我们通常就应该要考虑用模板方法模式了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焱童鞋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值