Java设计模式—模板方法(Template Method)

模板是指在薄片塑料板上面写字后挖空,再使用毛笔或色笔涂满挖空部分,就能看到纯手工而以不失工整的字样,看到模板上的挖空形状,马上就知道最后会变出什么样子的字,不过实际上所显现出来的字样还是要依所使用的画笔种类而定.拿黑色签字笔当画笔,结果当然就是签字笔的字样;当用铅笔来画,得到的也只会是灰黑色的铅笔字;如果用五颜六色的彩色笔,自然能创出让人眼花的多色字.但是,无论使用哪种文具,制作出来的字样都还是脱不了模板上已经固定的形状。

   下面我们用例子说明模板方法

  程序示例类之间的关系

技术分享

  1.模板类,相当于我们上面提到的薄片塑料板

Java代码  技术分享
  1. package com.pattern.templateMethod;  
  2.   
  3. /** 
  4.  * 抽象类,充当模板角色 
  5.  * @author administrator 
  6.  * 
  7.  */  
  8. public abstract class AbstractDisplay {  
  9.     //由子类实现的抽象方法  
  10.     public abstract void open();     
  11.     public abstract void print();  
  12.     public abstract void close();  
  13.     //抽象类实现的方法,final可以保证在子类不会被修改  
  14.     public final void display() {  
  15.         open();   //先open...  
  16.         for(int i=0; i < 5; i++) {  //反复输出5次  
  17.             print();    
  18.         }  
  19.         close(); //输出完毕,close  
  20.     }  
  21. }  

 

  2.字符类,输出单个字符

Java代码  技术分享
  1. package com.pattern.templateMethod;  
  2.   
  3. public class CharDisplay extends AbstractDisplay {  
  4.     private char ch;     //应输出的字符  
  5.     public CharDisplay(char ch) {  //把构造函数传递过来的字符ch,存储在字段内  
  6.         this.ch = ch;  
  7.     }  
  8.     
  9.     public void open() {  
  10.         System.out.print("<<");   //输出"<<"作为开始字符串  
  11.     }  
  12.     public void close() {  
  13.         System.out.println(">>");  //输出 ">>"作为结束字符串  
  14.     }  
  15.     public void print() {  
  16.         System.out.print(ch);    //输出存储在字段的字符  
  17.     }  
  18.   
  19. }  

 

   3.字符串类,输出字符串

Java代码  技术分享
  1. package com.pattern.templateMethod;  
  2.   
  3. /** 
  4.  *  
  5.  * @author administrator 
  6.  */  
  7. public class StringDisplay extends AbstractDisplay {  
  8.     private String string;  //应输出的字符串  
  9.     private int width;      //以byte为单位所求出的字符串的"长度"  
  10.       
  11.     public StringDisplay(String string) {  
  12.         this.string =string;  
  13.         width = string.getBytes().length;  
  14.     }  
  15.   
  16.     public void open() {  //打印头装饰字符串  
  17.         printLine();  
  18.     }  
  19.     public void print() { //打印内容  
  20.         System.out.println("|"+string+"|");  
  21.     }  
  22.     public void close() { //打印尾装饰字符串  
  23.         printLine();  
  24.     }  
  25.   
  26.     public void printLine() {  
  27.         System.out.print("+");  //输出"+"号表示边框位置  
  28.         for(int i=0; i < width; ++i) {  
  29.             System.out.print("-");  //当作线段  
  30.         }  
  31.         System.out.println("+");  //输出"+"号表示边框位置  
  32.     }  
  33. }  

  4.测试类

Java代码  技术分享
  1. package com.pattern.templateMethod;  
  2.   
  3. public class Main {  
  4.     public static void main(String[] args) {  
  5.         //建立1个有‘A‘的CharDisplay的对象  
  6.         AbstractDisplay d1 = new CharDisplay(‘A‘);  
  7.         //建立1个有"Hello world"的StringDisplay的对象  
  8.         AbstractDisplay d2 = new StringDisplay("Hello World");  
  9.           
  10.         //d1,d2都是AbstractDisplay的子类对象,可以调用继承到的display()方法  
  11.         d1.display();  
  12.         d2.display();  
  13.     }  
  14. }  

 

 输出:

 

C代码  技术分享
  1.  <<AAAAA>>  
  2. +-----------+  
  3. |Hello World|  
  4. |Hello World|  
  5. |Hello World|  
  6. |Hello World|  
  7. |Hello World|  
  8. +-----------+  

 

 

 

 

 

设计思想:

  作为模板的方法定义在父类(父类为抽象类),而方法定义使用抽象方法,实现抽象方法的是子类,要在子类实现方法,才能决定具体的操作。如果在不同的子类执行不同实现就可以发展出不同的处理内容。不过,无论在哪个子类执行任何一种实现,处理的大致流程都还是要依照父类制定的方式。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。