大话设计模式笔记(七)——模版方法模型

  • 2019 年 10 月 30 日
  • 笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/76549525

第十章 模版方法模型

含义

在父类中定义一个操作的算法骨架,将算法的一些步骤放到子类去实现。模版方法使得子类不改变算法结构的情况下即可重定义算法的特定步骤。

UML

需求:现有试卷一份,通过模版方法模型完成试卷模版和答卷。

UML图

代码

AbstractTempleExampage

public abstractclass AbstractTempleExampage{      public final void question1(){          System.out.println("杨过得到后给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是?a.球磨铸铁;b.马口铁;c.高速合金钢;d.碳素纤维。");          System.out.println("答案:" +answer1());      }        public final void question2(){          System.out.println("杨过、程英、陆无双铲除了情花,造成?a.使这种植物不再害人;b.使一种珍稀物种灭绝;c.破坏了那个生物圈的生态平衡;d.造成该地区沙漠化;");          System.out.println("答案:" +answer2());      }        public final void question3(){          System.out.println("蓝凤凰的致使华山师徒、桃谷六仙呕吐不止的药酒属于( ) a.生物毒品 b.神经毒品 c.化学毒品 d.基因毒品 e.以上全不对 ");          System.out.println("答案:" +answer3());      }        protected abstract String answer1();        protected abstract String answer2();        protected abstract String answer3();  }

ExampageA

public class ExampageA extends AbstractTempleExampage {      @Override      protected String answer1() {          return "a";      }        @Override      protected String answer2() {          return "b";      }        @Override      protected String answer3() {          return "c";      }  }

ExampageB

public class ExampageB extends AbstractTempleExampage {      @Override      protected String answer1() {          return "a";      }        @Override      protected String answer2() {          return "c";      }        @Override      protected String answer3() {          return "b";      }  }

总结

模版方法模式是通过把不变的行为搬移到超类,变动的行为搬移到子类,去除子类中的重复代码来体现它的优势。

模版方法模式是很常用的模式,在Java的io中,InputStream类的read()方法就是使用模版方法。

代码节选

public abstract int read() throws IOException;    /** doc */  public int read(byte b[]) throws IOException {      return read(b, 0, b.length);  }    /** doc */  public int read(byte b[], int off, int len) throws IOException {      if (b == null) {          throw new NullPointerException();      } else if (off < 0 || len < 0 || len > b.length - off) {          throw new IndexOutOfBoundsException();      } else if (len == 0) {          return 0;      }        int c = read();      if (c == -1) {          return -1;      }      b[off] = (byte)c;        int i = 1;      try {          for (; i < len ; i++) {              c = read();              if (c == -1) {                  break;              }              b[off + i] = (byte)c;          }      } catch (IOException ee) {      }      return i;  }

应用场景

当多个子类是解决某一问题,他们的算法结构相同,只有一些某些实现不同时,可以使用模版方法。