1、模板方法模式
Question:假设甲乙两个人抄文档,两个人除了回答不同其余部分都相同,此时如何编写代码实现功能。
- 首先在不应用模板方法时
//甲抄的文档
public class TestPaperA {
public void TestQuestion1() {
System.out.println("问题一: a,b,c,d");
System.out.println("a");
}
public void TestQuestion2() {
System.out.println("问题二: a,b,c,d");
System.out.println("b");
}
public void TestQuestion3() {
System.out.println("问题三: a,b,c,d");
System.out.println("c");
}
}
//乙抄的文档
public class TestPaperB {
public void TestQuestion1() {
System.out.println("问题一: a,b,c,d");
System.out.println("b");
}
public void TestQuestion2() {
System.out.println("问题二: a,b,c,d");
System.out.println("c");
}
public void TestQuestion3() {
System.out.println("问题三: a,b,c,d");
System.out.println("a");
}
}
//主函数测试类
public class Test {
/**
* @Title: main
* @Description: 主函数测试类
* @return void
*/
public static void main(String[] args) {
System.out.println("甲抄的文档");
TestPaperA testPaperA = new TestPaperA();
testPaperA.TestQuestion1();
testPaperA.TestQuestion2();
testPaperA.TestQuestion3();
}
}
- 经过提炼一次的代码(将代码中重复的部分抽出来)
//测试类变化不大,其余类有所变化
//定义一个问题类
public class TestPaper {
public void TestQuestion1() {
System.out.println("问题一: a,b,c,d");
}
public void TestQuestion2() {
System.out.println("问题二: a,b,c,d");
}
public void TestQuestion3() {
System.out.println("问题三: a,b,c,d");
}
}
//甲抄的文件
public class TestPaperA extends TestPaper {
@Override
public void TestQuestion1() {
super.TestQuestion1();
System.out.println("a");
}
@Override
public void TestQuestion2() {
super.TestQuestion2();
System.out.println("b");
}
@Override
public void TestQuestion3() {
super.TestQuestion3();
System.out.println("c");
}
}
//乙抄的文件
public class TestPaperB extends TestPaper {
@Override
public void TestQuestion1() {
super.TestQuestion1();
System.out.println("b");
}
@Override
public void TestQuestion2() {
super.TestQuestion2();
System.out.println("c");
}
@Override
public void TestQuestion3() {
super.TestQuestion3();
System.out.println("a");
}
}
- 但是代码还是存在很多的重复,此时应该怎么解决呢?此时模板模式就登场了
//将每个答案定义为一个函数子类继承重写该函数便可以实现一套模板多用
public class TestPaper {
public void TestQuestion1() {
System.out.println("问题一: a,b,c,d");
System.out.println("结果为" + answer1());
}
public void TestQuestion2() {
System.out.println("问题二: a,b,c,d");
System.out.println("结果为" + answer2());
}
public void TestQuestion3() {
System.out.println("问题三: a,b,c,d");
System.out.println("结果为" + answer3());
}
public String answer1() {
return "";
}
public String answer2() {
return "";
}
public String answer3() {
return "";
}
}
//甲乙两人只需要重写answer系列方法就可以实现结果的输出
public class TestPaperA extends TestPaper {
@Override
public String answer1() {
return "c";
}
@Override
public String answer2() {
return "b";
}
@Override
public String answer3() {
return "a";
}
}
public class TestPaperB extends TestPaper {
@Override
public String answer1() {
return "a";
}
@Override
public String answer2() {
return "b";
}
@Override
public String answer3() {
return "c";
}
}
//主函数测试类
public class Test {
/**
* @Title: main
* @Description: TODO
* @return void
*/
public static void main(String[] args) {
System.out.println("甲抄的文档");
TestPaper testPaperA = new TestPaperA();
testPaperA.TestQuestion1();
testPaperA.TestQuestion2();
testPaperA.TestQuestion3();
}
}
借鉴资料:大话设计模式
注:自学过程,可能存在小问题,望大家指出,不喜勿喷