模版方法模式

10人阅读 评论(0) 收藏 举报

转载自 23种设计模式(6):模版方法模式

定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。

类型:行为类模式

类图:

        事实上,模版方法是编程中一个经常用到的模式。先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来。经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了。但是A有办法,先把打印功能完成,排序功能另找人做。

[java] view plain copy
  1. abstract class AbstractSort {  
  2.       
  3.     /** 
  4.      * 将数组array由小到大排序 
  5.      * @param array 
  6.      */  
  7.     protected abstract void sort(int[] array);  
  8.       
  9.     public void showSortResult(int[] array){  
  10.         this.sort(array);  
  11.         System.out.print("排序结果:");  
  12.         for (int i = 0; i < array.length; i++){  
  13.             System.out.printf("%3s", array[i]);  
  14.         }  
  15.     }  
  16. }  

        写完后,A找到刚毕业入职不久的同事B说:有个任务,主要逻辑我已经写好了,你把剩下的逻辑实现一下吧。于是把AbstractSort类给B,让B写实现。B拿过来一看,太简单了,10分钟搞定,代码如下:

[java] view plain copy
  1. class ConcreteSort extends AbstractSort {  
  2.   
  3.     @Override  
  4.     protected void sort(int[] array){  
  5.         for(int i=0; i<array.length-1; i++){  
  6.             selectSort(array, i);  
  7.         }  
  8.     }  
  9.       
  10.     private void selectSort(int[] array, int index) {  
  11.         int MinValue = 32767// 最小值变量  
  12.         int indexMin = 0// 最小值索引变量  
  13.         int Temp; // 暂存变量  
  14.         for (int i = index; i < array.length; i++) {  
  15.             if (array[i] < MinValue){ // 找到最小值  
  16.                 MinValue = array[i]; // 储存最小值  
  17.                 indexMin = i;   
  18.             }  
  19.         }  
  20.         Temp = array[index]; // 交换两数值  
  21.         array[index] = array[indexMin];  
  22.         array[indexMin] = Temp;  
  23.     }  
  24. }  

写好后交给A,A拿来一运行:

[java] view plain copy
  1. public class Client {  
  2.     public static int[] a = { 1032195712043 }; // 预设数据数组  
  3.     public static void main(String[] args){  
  4.         AbstractSort s = new ConcreteSort();  
  5.         s.showSortResult(a);  
  6.     }  
  7. }  

运行结果:

排序结果:  0  1  3  4  5  7  9 10 12 32

        运行正常。行了,任务完成。没错,这就是模版方法模式。大部分刚步入职场的毕业生应该都有类似B的经历。一个复杂的任务,由公司中的牛人们将主要的逻辑写好,然后把那些看上去比较简单的方法写成抽象的,交给其他的同事去开发。这种分工方式在编程人员水平层次比较明显的公司中经常用到。比如一个项目组,有架构师,高级工程师,初级工程师,则一般由架构师使用大量的接口、抽象类将整个系统的逻辑串起来,实现的编码则根据难度的不同分别交给高级工程师和初级工程师来完成。怎么样,是不是用到过模版方法模式?

 

模版方法模式的结构

       模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种:

  • 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
  • 模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
  • 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
  • 抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。

       实现类用来实现细节。抽象类中的模版方法正是通过实现类扩展的方法来完成业务逻辑。只要实现类中的扩展方法通过了单元测试,在模版方法正确的前提下,整体功能一般不会出现大的错误。

 

模版方法的优点及适用场景

       容易扩展。一般来说,抽象类中的模版方法是不易反生改变的部分,而抽象方法是容易反生变化的部分,因此通过增加实现类一般可以很容易实现功能的扩展,符合开闭原则。

       便于维护。对于模版方法模式来说,正是由于他们的主要逻辑相同,才使用了模版方法,假如不使用模版方法,任由这些相同的代码散乱的分布在不同的类中,维护起来是非常不方便的。

       比较灵活。因为有钩子方法,因此,子类的实现也可以影响父类中主逻辑的运行。但是,在灵活的同时,由于子类影响到了父类,违反了里氏替换原则,也会给程序带来风险。这就对抽象类的设计有了更高的要求。

       在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。

 


查看评论

设计模式之工厂方法模式详解与应用(2)

-
  • 1970年01月01日 08:00

设计模式初探-模板方法模式

模板方法模式(TEMPLATE METHOD),用于定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,属...
  • qbg19881206
  • qbg19881206
  • 2014-02-16 15:40:46
  • 1565

设计模式 模版方法模式 设计思想 演过过程 重构过程

  • 2012年08月15日 10:02
  • 208KB
  • 下载

JAVA中的设计模式 - 模版方法模式

JAVA中的设计模式 - 模版方法模式 模版方法模式:通过调用抽象父类,实现对子类的调用 1.构建抽象类import java.util.Random;/** * Created by 谭健 on ...
  • qq_15071263
  • qq_15071263
  • 2017-12-14 12:02:10
  • 1435

模版方法模式demo

  • 2015年07月20日 11:28
  • 8KB
  • 下载

23钟设计模式之模版方法模式

  • 2013年08月13日 10:48
  • 16KB
  • 下载

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

Android设计模式系列--模板方法模式 模板方法,和单例模式是我认为GOF的23中最简单的两种模式。 但是我个人对模板方法的经典思想特别推崇,虽然模板方法在大对数情...
  • wwj_748
  • wwj_748
  • 2013-11-29 11:48:39
  • 2039

模板方法模式(Template Method)

        模板方法模式的目的:在一个方法中定义一个算法,把算法的某些步骤进行抽象。这样可以把这些步骤从方法中移出,并在方法外部定义这些步骤,也可以用一个接口定义这些步骤,从而使其他类可以提供这些...
  • scucj
  • scucj
  • 2007-12-08 00:32:00
  • 1052

装饰模式 模板方法模式

装饰模式:动态给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 当系统需要新功能的时候,向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为。 把类中的...
  • henry860916
  • henry860916
  • 2017-05-13 09:12:56
  • 167

设计模式的分类以及六大设计原则

转载自http://www.2cto.com/kf/201606/520418.html设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、...
  • AZHELL
  • AZHELL
  • 2017-07-30 18:31:54
  • 183
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 619
    排名: 2万+
    文章存档