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

来源:互联网 发布:淘宝打折工具在哪 编辑:程序博客网 时间:2024/06/15 11:40
设计模式任务扩展class算法框架

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

类型:行为类模式

类图:

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

[java] view plaincopy
  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 plaincopy
  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 plaincopy
  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类型,指明主要的逻辑功能在子类中不能被重写。
  • 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
  • 抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。

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

 

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

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

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

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

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 换奶粉孩子不喝怎么办 宝宝整夜哭闹不睡觉怎么办 满月宝宝整夜不睡觉怎么办 6个半月宝宝一喂粥就哭怎么办 宝宝敷鸡蛋白过敏怎么办 七个月宝宝不吃米糊怎么办 涨奶引起的发烧怎么办 8个月宝宝积食怎么办 宝宝吃奶一会就睡了怎么办 宝宝喝凉酸奶拉肚子怎么办 宝宝戒奶不吃奶粉怎么办 三个月大婴儿不吃奶粉怎么办 三个月大的婴儿不吃奶粉怎么办 40天宝宝肚脐凸怎么办 6个月婴儿消化不好怎么办 2个月婴儿消化不好怎么办 10月婴儿不吃饭怎么办 9个月宝宝不吃饭怎么办 十个多月的宝宝便秘怎么办 十个多月宝宝便秘怎么办 8个月宝宝过敏怎么办 宝宝二十个月便秘怎么办 7个月宝宝便秘拉不出怎么办 二十六个月宝宝便秘怎么办 八个月宝宝吃鸡蛋过敏怎么办 8个月宝宝 吃盐怎么办 40多天婴儿拉肚怎么办 刚出生婴儿拉肚怎么办 20多天婴儿拉肚怎么办 米汤煮的太稠了怎么办 两岁宝宝不吃蔬菜怎么办 两岁宝宝不爱吃蔬菜怎么办 四个月宝宝头有点歪怎么办 宝宝吃过了还闹怎么办 ddrops d3吃多了怎么办 ddrops d3滴多了怎么办 维生素d滴多了怎么办 ddrops最后滴不出来的怎么办 ddrops一次滴3滴怎么办 小孩子头睡偏了怎么办 7岁儿童头睡偏了怎么办