设计模式——模版方法模式

来源:互联网 发布:易语言收银系统源码 编辑:程序博客网 时间:2024/06/11 06:05

模版模式

  模版方法模式:定义一下操作中的算法骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  模版方法模式结构图
  这里写图片描述
  AbstractClass是抽象类,其实也就是一抽象模版,定义并实现了一个模版方法。这个模版方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象类操作中,推迟到子类实现。
  ConcreteClass,实现父类所定义的一个或多个抽象方法。每个AbstractClass都可以有任意多个ConcreteClass与之对应,而每个ConcreteClass都可以给出这些抽象方法的不同实现,从而使得顶层逻辑的实现各不相同。

  具体场景:
  一次考试,所有学生拿到的试卷都是一样的,不同的只是各个学生对试题所做出的不同答案。因此这里的试卷可以看成是一个抽象类,其定义了所有试题以及预留一个抽象方法,来给每个试题做出答案。具体代码如下
  

public abstract class TestPaper {    public abstract String answer1();    public abstract String answer2();    public abstract String answer3();    public void question1() {        System.out.println("中国有多少个民族? A:18 B:55 C:56 D:60");        System.out.println("答案是:" + answer1());    }    public void question2() {        System.out.println("中国的首都是? A:北京 B:南京 C:西京 D:东京");        System.out.println("答案是:" + answer2());    }    public void question3() {        System.out.println("上海的别名是? A:下海 B:魔都 C:疙瘩地儿 D:风水宝地");        System.out.println("答案是:" + answer3());    }}

  而所有的实现类,只用实现TestPaper类中定义的抽象方法即可,这样就可以实现不同学生对试题做出自己的答案。具体代码如下:
  

public class TestPaperA extends TestPaper {    @Override    public String answer1() {        return "C";    }    @Override    public String answer2() {        return "A";    }    @Override    public String answer3() {        return "B";    }}

测试代码如下:

public class Test {    public static void main(String[] args) {        TestPaperA paperA = new TestPaperA();        paperA.question1();        paperA.question2();        paperA.question3();        System.out.println("=========================");        TestPaperB paperB = new TestPaperB();        paperB.question1();        paperB.question2();        paperB.question3();    }}

输出结果:
这里写图片描述

模版方法的特点:
  当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模版方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
  模版方法模式就是通过把不变的行为搬到超类,去除子类中的重复代码。可以提高代码的复用性,降低代码的维护成本。
  

原创粉丝点击