Template Method Pattern S. Yukita [email protected] Template Method パターン • スーパークラスにテンプレートとなるメソッドの定 義をおく。定型処理の枠組みを決める。 – テンプレートは public final で修飾される。 • テンプレートメソッドは要素的なアクションを実行 して定型処理のロジックを実現する。 – 要素アクションは抽象メソッドとしておく。 – つまり abstract protected がよいだろう。 – サブクラスではそれらの抽象メソッドを具体的に定義 する。 – これらは hook method と呼ばれる。 Template Pattern 2 例題の クラス図 AbstractDisplay open print close display CharDisplay StringDisplay open print close open print close Template Pattern 3 AbstractDisplay.java public abstract class AbstractDisplay { public abstract void open(); // サブクラスで実装 public abstract void print(); // サブクラスで実装 public abstract void close(); // サブクラスで実装 public final void display() { // この抽象クラスで実装 open(); for (int i = 0; i < 5; i++) print(); close(); } } Template Pattern 4 CharDisplay.java public class CharDisplay extends AbstractDisplay { private char ch; public CharDisplay(char ch) { this.ch = ch;} public void open(){ System.out.print("<<"); } public void print(){ System.out.print(ch); } public void close(){ System.out.println(">>"); } } Template Pattern 5 StringDisplay.java (1) public class StringDisplay extends AbstractDisplay { private String string; private int width; public StringDisplay(String string) { this.string = string; this.width = string.getBytes().length; } Template Pattern 6 StringDisplay.java (2) public void open() { printLine(); } public void print() { System.out.println("|" + string + "|"); } public void close() { printLine(); } Template Pattern 7 StringDisplay.java (3) private void printLine() { System.out.print("+"); for (int i = 0; i < width; i++) { System.out.print("-"); } System.out.println("+"); } } Template Pattern 8 Main.java public class Main { public static void main(String[] args) { AbstractDisplay d1 = new CharDisplay('H'); AbstractDisplay d2 = new StringDisplay("Hello, world."); AbstractDisplay d3 = new StringDisplay("こんにちは。"); d1.display(); d2.display(); d3.display(); } } Template Pattern 9 実行結果 <<HHHHH>> +-------------+ |Hello, world.| |Hello, world.| |Hello, world.| |Hello, world.| |Hello, world.| +-------------+ +------------+ |こんにちは。| |こんにちは。| |こんにちは。| |こんにちは。| |こんにちは。| +------------+ Template Pattern 10 パターン AbstractClass method1 method2 method3 templateMethod ConcreteClass method1 method2 method3 Template Pattern 11 例題の 解釈 template method AbstractDisplay open print close display =役に伴うシナリオ 抽象的 要素的な アクション群 役者の個性=具体的 override 不可 CharDisplay StringDisplay open print close open print close 役者たち Template Pattern 12
© Copyright 2025 ExpyDoc