学生们抄题考试

我们需要考虑的

  • 如果题目临时修改,代码的修改量要降低到最小
  • 尽量排除“抄错”带来的损失
  • 子类不应有重复,重复要上升到父类

模板方法UML图

avatar

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

基于模式原型的代码实现

抽象类

1
2
3
4
5
6
7
8
9
10
11
public abstract class AbstractClass {
// 抽象行为,放到子类实现
public abstract void primitiveOperation1();
public abstract void primitiveOperation2();

// 模板方法,给出了逻辑的骨架。逻辑推迟到子类实现。
public void templateMethod() {
primitiveOperation1();
primitiveOperation2();
}
}

具体方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ConcreteClassA extends AbstractClass {
@Override
public void primitiveOperation1() {
System.out.println("具体类A方法1实现");
}

@Override
public void primitiveOperation2() {
System.out.println("具体类A方法2实现");
}

@Override
public void templateMethod() {
super.templateMethod();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ConcreteClassB extends AbstractClass {
@Override
public void primitiveOperation1() {
System.out.println("具体类B方法1实现");
}

@Override
public void primitiveOperation2() {
System.out.println("具体类B方法2实现");
}

@Override
public void templateMethod() {
super.templateMethod();
}
}

客户端

1
2
3
4
5
6
7
8
public static void main(String[] args) {
AbstractClass c = null;
c = new ConcreteClassA();
c.templateMethod();;

c = new ConcreteClassB();
c.templateMethod();
}

基于情景的代码实现

卷子类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstract class Paper {
public void question1() {
System.out.println("第一题");
}
public void question2() {
System.out.println("第二题");
}
public abstract String answer1();
public abstract String answer2();
public void copyPaper() {
question1();
question2();
}
}

具体卷子类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class StudentAPaper extends Paper {
@Override
public void question1() {
super.question1();
}

@Override
public void question2() {
super.question2();
}

@Override
public String answer1() {
return "studentA answer1";
}

@Override
public String answer2() {
return "studentA answer2";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class StudentBPaper extends Paper {
@Override
public void question1() {
super.question1();
}

@Override
public void question2() {
super.question2();
}

@Override
public String answer1() {
return "studentB answer1";
}

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

客户端

1
2
3
4
5
6
7
 public static void main(String[] args) {
Paper studentPaperA = new StudentAPaper();
studentPaperA.copyPaper();

Paper studentPaperB = new StudentBPaper();
studentPaperB.copyPaper();
}

模板模式的优势

  • 代码复用

本文部分内容改编于程杰老师的《大话设计模式》