Template method パターン

  1. Template Method パターン
     類似したパターンの仕事がある、あるいは、出そうなとき、抽象レベルの「単純」メソッドとそれを組み合わせたメソッドを定義しておきます。あとは「単純」メソッドを、具体的メソッドに置き換えれば、完成します。
     「組み合わせたメソッド」が再利用できるかどうかが、この手法の鍵になります
    プログラム構造に特徴はなく、多態性の応用ともいえるパターンです。

  2. プログラム
     AbstractDisplay がテンプレートになります。open,print,close を利用した、display() パターンが再利用の鍵です(この例は、少し説得力に欠けます)。ここでも、CharDisplayのインスタンスを抽象クラスのインスタンスとしていることで、display()の利用が可能になっています。
     
    public class template {
        public static void main(String[] args) {
            AbstractDisplay d1 = new CharDisplay('H');  
            AbstractDisplay d2 = new StringDisplay("Hello, world."); 
            d1.display(); 
            d2.display(); 
        }
    }
    
    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();  
        }
    }
    
    
     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(">>");  
        }
    }
    
    class StringDisplay extends AbstractDisplay {
        private String string;                          
        private int width;                              
        public StringDisplay(String string) {           
            this.string = string;                       
            this.width = string.getBytes().length;      
        }
        public void open() {                            
            printLine();                                
        }
        public void print() {                           
            System.out.println("|" + string + "|");     
        }
        public void close() {                           
            printLine();                                
        }
        private void printLine() {                      
            System.out.print("+");                      
            for (int i = 0; i < width; i++) {           
                System.out.print("-");                  
            }
            System.out.println("+");                    
        }
    }