1. 概念
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模版方法使得
子类可以不改变一个算法的结构即可重定义该算法的某一些特定步骤。
2. 定义抽象模版
public abstract class TestPaper {
protected String userName;
public TestPaper(String userName){
this.userName = userName;
}
public void testQuestiton1(){
System.out.println("小哥我帅不帅");
System.out.println(userName+" 的回答:"+getAnswer1());
}
public void testQuestiton2(){
System.out.println("小哥我努力不努力");
System.out.println(userName+" 的回答:"+getAnswer2());
}
public void testQuestiton3(){
System.out.println("小哥我能月入20不");
System.out.println(userName+" 的回答:"+getAnswer3());
}
public void testQuestiton4(){
System.out.println("小哥我能找到对象不");
System.out.println(userName+" 的回答:"+getAnswer4());
}
public void testQuestiton5(){
System.out.println("小哥我好困啊,有没有");
System.out.println(userName+" 的回答:"+getAnswer5());
}
public void templateMethod(){
testQuestiton1();
testQuestiton2();
testQuestiton3();
testQuestiton4();
testQuestiton5();
}
public String getAnswer1(){
return "";
}
public String getAnswer2(){
return "";
}
public String getAnswer3(){
return "";
}
public String getAnswer4(){
return "";
}
public String getAnswer5(){
return "";
}
}
3. 封装具体的模版
1.
public class TestPaperA extends TestPaper{
public TestPaperA(String userName) {
super(userName);
}
@Override
public String getAnswer1() {
return "帅";
}
@Override
public String getAnswer2() {
return "努力";
}
@Override
public String getAnswer3() {
return "能";
}
@Override
public String getAnswer4() {
return "必须的能";
}
@Override
public String getAnswer5() {
return "不困到天明";
}
}
2.
public class TestPaperB extends TestPaper{
public TestPaperB(String userName) {
super(userName);
}
@Override
public String getAnswer1() {
return "还行";
}
@Override
public String getAnswer2() {
return "还好";
}
@Override
public String getAnswer3() {
return "可以的";
}
@Override
public String getAnswer4() {
return "没问题";
}
@Override
public String getAnswer5() {
return "小困,可以坚持下";
}
}
3.
public class TestPaperC extends TestPaper{
public TestPaperC(String userName) {
super(userName);
}
@Override
public String getAnswer1() {
return "好看的皮囊千篇一律,有趣的灵魂万里挑一";
}
@Override
public String getAnswer2() {
return "没有最努力,只有更努力";
}
@Override
public String getAnswer3() {
return "月入百万不是梦";
}
@Override
public String getAnswer4() {
return "迎娶白富美";
}
@Override
public String getAnswer5() {
return "困毛线,接着干";
}
}
4. 测试类
@org.junit.Test
public void test(){
TestPaper studentA = new TestPaperA("zlc");
studentA.templateMethod();
System.out.println("----------------------");
TestPaper studentB = new TestPaperB("cc");
studentB.templateMethod();
System.out.println("----------------------");
TestPaper studentC = new TestPaperC("lecheng");
studentC.templateMethod();
}
5.小结
模版方法模式提供了一个很好的代码复用平台,通过
把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。