设计模式-模板方法
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法通过把不变的行为搬到父类,去除子类中的重复代码来提现他的优势。
模板方法其实就是我们抽象类的写法,抽象类中有两种方法,一种就是已经实现了的,一种就是还没有实现的。已经实现了的就是通用的方法,还没有实现就是每个子类不同的处理方法。
这个设计模式是我们经常使用的,但可能你并不知道它的名字。
先来个UML图:
下面简单例子:
考试的题目对大家一样的,但是答案每个人都可能不同。所以题目可以在父类实现,而答案需要在子类进行重写。
先来个父类:
/**
* 考试抽象类
*/
public abstract class Exam {
/**
* 问题1 对所有人都一样
*/
public void quesA(){
System.out.println("1: 1+1 = ?");
}
/**
* 问题2 对所有人都一样
*/
public void quesB(){
System.out.println("2: 2+5 = ?");
}
/**
* 问题3 对所有人都一样
*/
public void quesC(){
System.out.println("3: 10-3 = ?");
}
/**
* 交卷 所有人都一样
*/
public void submit(){
name();
quesA();
answerA();
quesB();
answerB();
quesC();
answerC();
System.out.println();
}
/**
* 名字
*/
abstract void name();
/**
* 答案1 需要每个人实现
*/
abstract void answerA();
/**
* 答案2 需要每个人实现
*/
abstract void answerB();
/**
* 答案3 需要每个人实现
*/
abstract void answerC();
}
小李做的试卷:
public class LiExam extends Exam {
@Override
void name() {
System.out.println("小李");
}
@Override
void answerA() {
System.out.println("2");
}
@Override
void answerB() {
System.out.println("7");
}
@Override
void answerC() {
System.out.println("7");
}
}
小红做的试卷:
public class HongExam extends Exam {
@Override
void name() {
System.out.println("小红");
}
@Override
void answerA() {
System.out.println("2");
}
@Override
void answerB() {
System.out.println("9");
}
@Override
void answerC() {
System.out.println("7");
}
}
测试:
public static void main(String[] args) {
Exam li = new LiExam();
li.submit();
Exam hong = new HongExam();
hong.submit();
}
测试结果:
小李
1: 1+1 = ?
2
2: 2+5 = ?
7
3: 10-3 = ?
7
小红
1: 1+1 = ?
2
2: 2+5 = ?
9
3: 10-3 = ?
7
上面的例子还是很简单的,你可以简单感受下模板方法的用法,感觉是不是就是特别简单,以前你也一直在使用。
设计模式也就是这样,他的思路都没有那么复杂,他就是我们经验的总结。