樣板模式

Prerequisites:

樣板模式的重點,把不變的內容放在抽象父類別,會變的放在子類別。

什麼是樣板模式?

想像成問卷,題目是一樣,把一樣的題目放在父類別。

但每個人回答的答案是不一樣的,不一樣的地方,就由子類別自己去覆寫。

父類別放一樣的內容

1
2
3
4
5
6
7
8
9
10
11
public abstract class Question {
  public void getQuestion() {
    // 題目都一樣
    System.out.println("你最喜歡的夜市美食是什麼?");
    // 回答內容不一樣,由子類別覆寫
    answer();
  }

  // 回答內容不一樣,由子類別覆寫
  public abstract void answer();
}

子類別覆寫不一樣的內容

Answer1

1
2
3
4
5
6
public class Answer1 extends Question{
  @Override
  public void answer() {
    System.out.println("蚵仔煎");
  }
}

Answer2

1
2
3
4
5
6
public class Answer2 extends Question{
  @Override
  public void answer() {
    System.out.println("臭豆腐");
  }
}

Answer3

1
2
3
4
5
6
public class Answer3 extends Question{
  @Override
  public void answer() {
    System.out.println("雞排");
  }
}

Client測試

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Client {
  public static void main(String[] args) {
    Question ans1 = new Answer1();
    ans1.getQuestion();
    System.out.println("=======================");

    Question ans2 = new Answer2();
    ans2.getQuestion();
    System.out.println("=======================");

    Question ans3 = new Answer3();
    ans3.getQuestion();
    System.out.println("=======================");
  }
}
你最喜歡的夜市美食是什麼?
蚵仔煎
=======================
你最喜歡的夜市美食是什麼?
臭豆腐
=======================
你最喜歡的夜市美食是什麼?
雞排
=======================

計算執行時間樣板

計算執行時間的方式是固定的,但執行的程式碼不知道怎麼執行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
abstract class CaculateJobTime {
  // 不知道怎麼執行的程式碼,改成抽象方法,由子類別去覆蓋這個方法
  abstract void job();

  // 計算程式執行時間
  public void caculate() {
    long start = System.currentTimeMillis();
    // 要執行的程式碼
    job();
    // 計算執行時間
    long end = System.currentTimeMillis();
    System.out.println("執行 " + (end - start) + " 毫秒");
  }
}
1
2
3
4
5
6
7
8
class JobA extends CaculateJobTime {
  @Override
  void job() {
    for (int i = 0 ; i < 10000000; i++) {
      long result = i * i;
    }
  }
}
1
2
3
4
5
6
7
8
class JobB extends CaculateJobTime {
  @Override
  void job() {
    for (int i = 0 ; i < 50000000; i++) {
      long result = i * i;
    }
  }
}

測試

1
2
3
4
5
6
7
8
9
public class Test {
  public static void main(String[] args) {
    JobA jobA = new JobA();
    jobA.caculate();

    JobB jobB = new JobB();
    jobB.caculate();
  }
}
執行 4 毫秒
執行 5 毫秒

results matching ""

    No results matching ""