今天看书,看到了模版模式,就顺便复习一下,模版模式是父类建立骨架,而子类具体实现其方法。它是把不变的行为搬移到了父类,去除了子类重复的代码,它提供了一个很好的代码复用的平台。当不变的行为和可变的行为在子类中混合在一起的时候,不变的行为就会在代码中重复。通过模版方法行为把重复的行为转移到单一的地方,这样就帮助子类摆脱重复代码的纠缠。
例如:一个复杂的例子用模版模式是如何实现的。考生做试题,传统的方法是这样的,两个人做答其代码是这个样子的
/** * * @功能 * @创建人 gao_jie * @创建日期 Jun 17, 2009 * @版本 1.0 * */ public class TestPaperA { public void questionA(){ System.out.println("题目A"); System.out.println("你喜欢我吗? A:喜欢 B: 不喜欢"); System.out.println("答案:B"); } public void questionB(){ System.out.println("题目B"); System.out.println("你喜欢游泳吗? A:喜欢 B: 不喜欢"); System.out.println("答案:B"); } }
/** * * @功能 * @创建人 gao_jie * @创建日期 Jun 17, 2009 * @版本 1.0 * */ public class TestPaperB { public void questionA(){ System.out.println("题目A"); System.out.println("你喜欢我吗? A:喜欢 B: 不喜欢"); System.out.println("答案:A"); } public void questionB(){ System.out.println("题目B"); System.out.println("你喜欢游泳吗? A:喜欢 B: 不喜欢"); System.out.println("答案:A"); } }
/** * * @功能 * @创建人 gao_jie * @创建日期 Jun 17, 2009 * @版本 1.0 * */ public class Test { /** * @param args */ public static void main(String[] args) { TestPaperA PaperA = new TestPaperA(); PaperA.questionA(); PaperA.questionB(); TestPaperB PaperB = new TestPaperB(); PaperB.questionA(); PaperB.questionB(); } }
结果如下:
题目A
你喜欢我吗? A:喜欢 B: 不喜欢
答案:B
题目B
你喜欢游泳吗? A:喜欢 B: 不喜欢
答案:B
题目A
你喜欢我吗? A:喜欢 B: 不喜欢
答案:A
题目B
你喜欢游泳吗? A:喜欢 B: 不喜欢
答案:A
大家可以看出,两份卷子都包含重复的题目,如果我们把重复的公共的东西提取出来,放到一个父类中,重复代码会减少。如下所示。
/** * * @功能 抽象模版类 * @创建人 gao_jie * @创建日期 Jun 17, 2009 * @版本 1.0 * */ public abstract class AbstractTestPaper { /** * 公共方法1模版1 */ public void questionA() { System.out.println("题目A"); System.out.println("你喜欢我吗? A:喜欢 B: 不喜欢"); answerA(); } /** * 公共方法2模版2 */ public void questionB() { System.out.println("题目B"); System.out.println("你喜欢游泳吗? A:喜欢 B: 不喜欢"); answerB(); } /** * 抽象方法1 */ public abstract void answerA(); /** * 抽象方法2 */ public abstract void answerB(); }
/** * * @功能 * @创建人 gao_jie * @创建日期 Jun 17, 2009 * @版本 1.0 * */ public class TestPaperA extends AbstractTestPaper{ @Override public void answerA() { System.out.println("答案: A"); } @Override public void answerB() { System.out.println("答案: A"); } }
/** * * @功能 * @创建人 gao_jie * @创建日期 Jun 17, 2009 * @版本 1.0 * */ public class TestPaperB extends AbstractTestPaper { @Override public void answerA() { System.out.println("答案: B"); } @Override public void answerB() { System.out.println("答案: B"); } }
测试类
/** * * @功能 * @创建人 gao_jie * @创建日期 Jun 17, 2009 * @版本 1.0 * */ public class Test { /** * @param args */ public static void main(String[] args) { AbstractTestPaper PaperA = new TestPaperA(); PaperA.questionA(); PaperA.questionB(); AbstractTestPaper PaperB = new TestPaperB(); PaperB.questionA(); PaperB.questionB(); } }
结果
题目A
你喜欢我吗? A:喜欢 B: 不喜欢
答案: A
题目B
你喜欢游泳吗? A:喜欢 B: 不喜欢
答案: A
题目A
你喜欢我吗? A:喜欢 B: 不喜欢
答案: B
题目B
你喜欢游泳吗? A:喜欢 B: 不喜欢
答案: B
而后面所用的方法就是设计模式中的模版方法。该方法的UML图为