`

行为型模式--模板方法模式(Template Method)

阅读更多

解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系图:

就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus分别继承AbstractCalculator类,通过对AbstractCalculator的调用实现对子类的调用,看下面的例子:

[java] view plaincopy
  1. public abstract class AbstractCalculator {  
  2.       
  3.     /*主方法,实现对本类其它方法的调用*/  
  4.     public final int calculate(String exp,String opt){  
  5.         int array[] = split(exp,opt);  
  6.         return calculate(array[0],array[1]);  
  7.     }  
  8.       
  9.     /*被子类重写的方法*/  
  10.     abstract public int calculate(int num1,int num2);  
  11.       
  12.     public int[] split(String exp,String opt){  
  13.         String array[] = exp.split(opt);  
  14.         int arrayInt[] = new int[2];  
  15.         arrayInt[0] = Integer.parseInt(array[0]);  
  16.         arrayInt[1] = Integer.parseInt(array[1]);  
  17.         return arrayInt;  
  18.     }  
  19. }  
[java] view plaincopy
  1. public class Plus extends AbstractCalculator {  
  2.   
  3.     @Override  
  4.     public int calculate(int num1,int num2) {  
  5.         return num1 + num2;  
  6.     }  
  7. }  

测试类:

[java] view plaincopy
  1. public class StrategyTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         String exp = "8+8";  
  5.         AbstractCalculator cal = new Plus();  
  6.         int result = cal.calculate(exp, "\\+");  
  7.         System.out.println(result);  
  8.     }  
  9. }  

我跟踪下这个小程序的执行过程:首先将exp和"\\+"做参数,调用AbstractCalculator类里的calculate(String,String)方法,在calculate(String,String)里调用同类的split(),之后再调用calculate(int ,int)方法,从这个方法进入到子类中,执行完return num1 + num2后,将值返回到AbstractCalculator类,赋给result,打印出来。正好验证了我们开头的思路。

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

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

 

[java] view plaincopy
 
  1. Java代码    
  2. package com.pattern.templateMethod;    
  3.     
  4. /**  
  5.  * 抽象类,充当模板角色  
  6.  * @author administrator  
  7.  *  
  8.  */    
  9. public abstract class AbstractDisplay {    
  10.     //由子类实现的抽象方法    
  11.     public abstract void open();       
  12.     public abstract void print();    
  13.     public abstract void close();    
  14.     //抽象类实现的方法,final可以保证在子类不会被修改    
  15.     public final void display() {    
  16.         open();   //先open...    
  17.         for(int i=0; i < 5; i++) {  //反复输出5次    
  18.             print();      
  19.         }    
  20.         close(); //输出完毕,close    
  21.     }    
  22. }    
  23.    
  24.   2.字符类,输出单个字符  
  25. Java代码    
  26. package com.pattern.templateMethod;    
  27.     
  28. public class CharDisplay extends AbstractDisplay {    
  29.     private char ch;     //应输出的字符    
  30.     public CharDisplay(char ch) {  //把构造函数传递过来的字符ch,存储在字段内    
  31.         this.ch = ch;    
  32.     }    
  33.       
  34.     public void open() {    
  35.         System.out.print("<<");   //输出"<<"作为开始字符串    
  36.     }    
  37.     public void close() {    
  38.         System.out.println(">>");  //输出 ">>"作为结束字符串    
  39.     }    
  40.     public void print() {    
  41.         System.out.print(ch);    //输出存储在字段的字符    
  42.     }    
  43.     
  44. }    
  45.    
  46.    3.字符串类,输出字符串  
  47. Java代码    
  48. package com.pattern.templateMethod;    
  49.     
  50. /**  
  51.  *   
  52.  * @author administrator  
  53.  */    
  54. public class StringDisplay extends AbstractDisplay {    
  55.     private String string;  //应输出的字符串    
  56.     private int width;      //以byte为单位所求出的字符串的"长度"    
  57.         
  58.     public StringDisplay(String string) {    
  59.         this.string =string;    
  60.         width = string.getBytes().length;    
  61.     }    
  62.     
  63.     public void open() {  //打印头装饰字符串    
  64.         printLine();    
  65.     }    
  66.     public void print() { //打印内容    
  67.         System.out.println("|"+string+"|");    
  68.     }    
  69.     public void close() { //打印尾装饰字符串    
  70.         printLine();    
  71.     }    
  72.     
  73.     public void printLine() {    
  74.         System.out.print("+");  //输出"+"号表示边框位置    
  75.         for(int i=0; i < width; ++i) {    
  76.             System.out.print("-");  //当作线段    
  77.         }    
  78.         System.out.println("+");  //输出"+"号表示边框位置    
  79.     }    
  80. }    
  81.   4.测试类  
  82. Java代码    
  83. package com.pattern.templateMethod;    
  84.     
  85. public class Main {    
  86.     public static void main(String[] args) {    
  87.         //建立1个有'A'的CharDisplay的对象    
  88.         AbstractDisplay d1 = new CharDisplay('A');    
  89.         //建立1个有"Hello world"的StringDisplay的对象    
  90.         AbstractDisplay d2 = new StringDisplay("Hello World");    
  91.             
  92.         //d1,d2都是AbstractDisplay的子类对象,可以调用继承到的display()方法    
  93.         d1.display();    
  94.         d2.display();    
  95.     }    
  96. }    
  97.    
  98.  输出:  
  99.    
  100. C代码    
  101.  <<AAAAA>>    
  102. +-----------+    
  103. |Hello World|    
  104. |Hello World|    
  105. |Hello World|    
  106. |Hello World|    
  107. |Hello World|    
  108. +-----------+    
 设计思想:作为模板的方法定义在父类(父类为抽象类),而方法定义使用抽象方法,实现抽象方法的是子类,要在子类实现方法,才能决定具体的操作。如果在不同的子类执行不同实现就可以发展出不同的处理内容。不过,无论在哪个子类执行任何一种实现,处理的大致流程都还是要依照父类制定的方式。

 

分享到:
评论

相关推荐

    c++设计模式-行为型模式-模板方法模式

    c++设计模式-行为型模式-模板方法模式;qt工程;c++简单源码; 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重...

    template-method-demo 模板方法示例

    在"template-method-demo"这个示例中,我们可以预见到它将展示如何在Java中应用模板方法模式。这个压缩包可能包含以下内容: 1. 一个抽象类(例如:`AbstractClass`),它定义了模板方法。在这个类中,可能会有一个...

    设计模式C++学习之模板方法模式(Template Method)

    模板方法模式(Template Method)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这个模式在C++编程中有着...

    设计模式--模板方法模式java例子

    模板方法模式是设计模式中行为型模式的一种,它在软件工程中扮演着非常重要的角色,尤其是在Java编程中。模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。它允许子类不改变一个算法的结构即可重...

    Head First 设计模式 (八) 模板方法模式(Template Method pattern) C++实现

    模板方法模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在C++这样的面向对象编程语言中。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的...

    设计模式-模板方法模式ppt

    - **抽象类(Abstract Class)**:包含一个或多个抽象方法,并且有一个模板方法(template method)。模板方法通常被声明为final,这意味着它不能被子类覆盖。 - **具体操作(Concrete Operations)**:在抽象类中...

    设计模式专题之(十三)模板模式---设计模式模板模式示例代码(python--c++)

    模板模式是一种行为设计模式,它使你能在不破坏封装性的前提下,定义执行算法的框架,而将一些步骤延迟到子类中。这样,你就能创建一个可复用的框架,将具体步骤留给子类来实现。这个模式的核心思想是抽象类定义了一...

    设计模式-模板方法模式(讲解及其实现代码)

    模板方法模式是一种行为设计模式,它允许在定义行为框架的同时,延迟部分具体步骤到子类中实现。这种模式主要用于在父类中定义算法的骨架,而将一些步骤的实现细节留给子类去完成,从而使得不同的子类可以重用相同的...

    java设计模式-模板模式

    3. **模板方法(Template Method)**:这是在抽象类中定义的方法,它调用了一个或多个钩子方法(即抽象方法或可选的具体方法)。模板方法执行整体算法的顺序,并且通常在最后调用钩子方法以完成算法的定制部分。 4....

    11.设计模式-模板方法模式1

    模板方法模式(Template Method Pattern)是一种行为设计模式,它允许在父类中定义算法的框架,然后由子类提供具体的实现。这种模式的核心是“模板方法”,它在父类中定义了一个操作的步骤顺序,并将某些步骤声明为...

    L14-设计模式-行为型模式v21

    2. 模板方法(Template Method)模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以在不修改算法结构的情况下重新定义该算法的某些步骤。 模板方法模式的优点是:可以实现算法的灵活性和可...

    C++设计模式课件3_Template Method_模板方法.pdf

    模板方法模式(Template Method Pattern)是一种行为型设计模式,它允许我们定义算法的骨架,并将部分步骤推迟到子类中实现。这种模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。 #### 模式背景...

    Template(模板模式)

    模板模式是一种行为设计模式,它使你能在不破坏封装性的前提下,定义对象间的一系列基本操作,并在子类中实现这些操作的具体步骤。在模板模式中,一个抽象类公开定义了执行它的方法的方式,而将具体实现延迟到子类中...

    模板方法模式----设计模式系列

    模板方法模式是面向对象设计模式的一种,它在行为模式中占据重要地位。此模式的核心思想是定义一个操作的框架,允许子类在这个框架内自定义具体的行为。这为代码复用和实现相同逻辑的不同实现提供了方便,同时也遵循...

    20-Template Method.rar

    模板方法(Template Method)设计模式是一种行为型设计模式,它在面向对象编程中扮演着重要的角色。这个模式允许我们定义一个操作中的算法骨架,而将一些步骤延迟到子类中。这样,子类可以不改变一个算法的结构即可...

    模板方法模式(TemplateMethod)原理图

    模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 具体来说,模板方法模式的关键特点包括: 抽象类:在抽象类中定义一个模板方法,该方法给出了算法的框架。 具体...

    设计模式_行为型_模板方法模式.md

    模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。 ### 模板方法模式的关键角色 1. **...

    模版方法模式TemplatePattern

    模板方法模式(Template Pattern)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。这种模式允许子类重新定义或改变某些基本操作,但整体结构和顺序保持不变。在Java编程中,...

    C++设计模式代码资源3_Template Method_模板方法.zip

    "模板方法"(Template Method)是设计模式中的一个经典概念,它属于行为设计模式,主要用在父类中定义一个算法的框架,允许子类在这个框架内重定义特定的步骤。这个模式通常用于代码复用和保持代码结构的一致性。 ...

    ios-iOS模板方法模式使用心得demo.zip

    在iOS开发中,模板方法模式是一种非常实用的设计模式,它属于行为设计模式,主要用于定义算法的骨架,而将一些步骤延迟到子类中。这种方式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。通过...

Global site tag (gtag.js) - Google Analytics