大话设计模式之模板方法模式(Java总结)
前言
我们有时会定义一套简单的业务流程,但是流程的每个步骤具体实现会有区别。模板方法模式就能很好地实现该逻辑。固定的业务流程就相当于是一套模板,每个步骤的具体实现相当于模板的具体内容。
场景
抄试卷答题
模板方法模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
代码示例
试卷类
public abstract class TestPaper { /** * 试题一 */ public void testQuestion1() { System.out.println("杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是[] " + "a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维"); System.out.println("答案:" + answer1()); } /** * 试题一回答 * @return */ protected abstract String answer1(); /** * 试题二 */ public void testQuestion2() { System.out.println("杨过、程英、陆无双铲除了情花,造成[] " + "a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化"); System.out.println("答案:" + answer2()); } /** * 试题二回答 * @return */ protected abstract String answer2(); /** * 试题三 */ public void testQuestion3() { System.out.println("蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[] " + "a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们喝大量的牛奶 e.以上全不对"); System.out.println("答案:" + answer3()); } /** * 试题三回答 * @return */ protected abstract String answer3(); }
学生甲抄的试卷
public class TestPaperA extends TestPaper { @Override protected String answer1() { return "b"; } @Override protected String answer2() { return "c"; } @Override protected String answer3() { return "a"; } }
学生乙抄的试卷
public class TestPaperB extends TestPaper { @Override protected String answer1() { return "c"; } @Override protected String answer2() { return "a"; } @Override protected String answer3() { return "a"; } }
客户端
public static void main(String[] args) { System.out.println("学生甲抄的试卷:"); TestPaper studentA = new TestPaperA(); studentA.testQuestion1(); studentA.testQuestion2(); studentA.testQuestion3(); System.out.println("学生乙抄的试卷:"); TestPaper studentB = new TestPaperB(); studentB.testQuestion1(); studentB.testQuestion2(); studentB.testQuestion3(); }
运行结果
特点
通过把不变行为搬移到超类,去除子类中的重复代码
参考资料 [1]: 大话设计模式 程杰著 清华大学出版社