大話設計模式筆記(七)——模版方法模型

  • 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;  }

應用場景

當多個子類是解決某一問題,他們的演算法結構相同,只有一些某些實現不同時,可以使用模版方法。