模板方法模式:父类中定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
动机:对于某一项任务,整体的操作步骤顺序固定,但具体步骤的内容有所不同时。
1.问题引入:标准化考试:
实现考试题相同,每个人的解答不同。
package computer;
public class Test {
public static void main(String[] args) {
System.out.println("学生A答的试卷:");
//子类变量的声明改成父类,利用多态性,实现代码重用
TestPaper A=new TestPaperA();
A.testQuestion1();
A.testQuestion2();
A.testQuestion3();
System.out.println("=================================================================");
System.out.println("学生B答的试卷:");
TestPaper B=new TestPaperB();
B.testQuestion1();
B.testQuestion2();
B.testQuestion3();
}
}
//父类(规定了题目)(建立模板)
class TestPaper{
public void testQuestion1() {
System.out.println("杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是:()");
System.out.println("A.球墨铸铁 B.马口铁 C.高速合金钢 D.碳素纤维");
System.out.println("答案:"+answer1());
}
public void testQuestion2() {
System.out.println("杨过、程英、陆无双铲除了情花,造成:()");
System.out.println("A.使这种植物不再害人 B.使一种珍惜物种灭绝 C.破环了生物圈的生态平衡 D.造成该地区沙漠化");
System.out.println("答案:"+answer2());
}
public void testQuestion3() {
System.out.println("如果你是大天,你会开什么药:()");
System.out.println("A.阿司匹林 B.牛黄解毒片 C.氟哌酸 D.喝大量牛奶 E.以上均不正确");
System.out.println("答案:"+answer3());
}
protected String answer1() {
return "";
}
protected String answer2() {
return "";
}
protected String answer3() {
return "";
}
}
//学生A答的试卷
class TestPaperA extends TestPaper{
protected String answer1() {
return "B";
}
protected String answer2() {
return "C";
}
protected String answer3() {
return "A";
}
}
//学生B答的试卷(只需要填上答案)
class TestPaperB extends TestPaper{
protected String answer1() {
return "C";
}
protected String answer2() {
return "A";
}
protected String answer3() {
return "A";
}
}
2.模板方法模式
package computer;
public class Test {
public static void main(String[] args) {
AbstractClass c;
c=new ConcreteClassA();
c.TemplateMethod();
c=new ConcreteClassB();
c.TemplateMethod();
}
}
abstract class AbstractClass{
//一些抽象行为,放到子类中去实现
public abstract void operation1();
public abstract void operation2();
//模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到了子类实现
public void TemplateMethod() {
operation1();
operation2();
System.out.println("");
}
}
//具体的类A
class ConcreteClassA extends AbstractClass{
public void operation1() {
System.out.println("具体类A方法1的实现。");
}
public void operation2() {
System.out.println("具体类A方法2的实现。");
}
}
//具体的类B
class ConcreteClassB extends AbstractClass{
public void operation1() {
System.out.println("具体类B方法1的实现。");
}
public void operation2() {
System.out.println("具体类B方法2的实现。");
}
}
模板方法模式:不变行为搬到超类中,去除子类中的重复代码。
优点:实现代码复用。
缺点:算法骨架不容易升级。(模板和子类是非常耦合的,若变更模板中的算法骨架,会影响子类变化)