摘要:本文深入浅出的讲述了设计模式中的模板模式,并给出了简单的示例,例子浅显易懂,并附带源代码。
模板模式属于行为型模式,其意图是定义一个操作的算法骨架,而将一些步骤延迟到子类中,可以不改变一个算法的结构即可以重新定义概算法的某些特定步骤。
考虑一些提供了一个冒泡排序算法的类,其定义了冒泡算法的基本骨架:在这个算法中定义了两个抽象的操作swap(int)即交换两个元素的位置和outOforder(index)即当前的元素是否符合顺序。执行分类的方法,Dosort()调用了抽象的方法,执行既定的动作。在实现int类型的冒泡排序中,只要实现两个抽象的方法就可以通过调用Dosort来获取正确的结果。
适用性:
l         一次性实现一个算法的不变部分,并将可变的部分留给子类来实现,
l         各个子类中公共的行为应该被提取出来并集中到一个公共父类中以避免代码的重复。
l         控制子类的扩展,模板方法旨在特定点调用”hook”操作
参与者:
AbstractClass(抽象类)
定义抽象的原语操作,具体子类将重订一他们以实现一个算法的各个步骤,
实现一个木板方法,定义一个算法的骨架,该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。
实现原语操作以完成算法中与特定子类相关的步骤。
ConcreteClass(具体类)
实现原语操作以完成算法中与特定子类相关的步骤。 
相互关系:具体类靠抽象类中的模板方法来完成算法中不变的部分。
模板方法导致一种反向的控制结构,即父类调用子类的方法。模板方法调用下列类型的操作:
具体的操作,具体的AbstractClass的操作,原语操作,钩子操作等。
以上的代码示例:
BubbleSorter抽象类
package template;
public abstract class BubbleSorter{
    private int operations;
    protected int length = 0;
    protected int doSort(){//掉用抽象方法
       operations = 0;
       if(length<=1)return operations;
       for (int nextToLast = length-2;nextToLast>=0;nextToLast--)
           for(int index = 0;index<=nextToLast;index++){
              if(outOfOrder(index)){
                  swap(index);
                  operations ++;
              }
       }
       return operations;
    }
    protected abstract void swap(int index);//定义的抽象方法
    protected abstract boolean outOfOrder(int index);
}
具体子类:
package template;
public class IntBubbleSorter extends BubbleSorter{
    private int[] array;
    public int sort(int[] array){
       this.array = array;
       length = array.length;
       return doSort();
    }
    protected void swap(int index){
       int temp = array[index];
       array[index]=array[index+1];
       array[index+1]=temp;
    }
    protected boolean outOfOrder(int index){
       return array[index]>array[index+1];
    }
}
   
客户端的调用:
package template;
public class Client{
    public static void main(String[] args){
       int[] intArray = {20,14,16,9,10,13,18};
       double[] dbArray = {20.50,20.43,20.88,20.45,20.72};
       IntBubbleSorter ibs = new IntBubbleSorter();
       ibs.sort(intArray);
       System.out.println("Int sorter");
       for(int i =0;i<intArray.length;i++)
           System.out.print(intArray[i]+",");
       System.out.println();
       DoubleBubbleSorter dbs = new DoubleBubbleSorter();
       dbs.sort(dbArray);
       System.out.println("Double sorter");
       for(int i =0;i<dbArray.length;i++)
           System.out.print(dbArray[i]+",");
       System.out.println();
    }
}
 
总结:模板方法在面向对象的设计中使用的比较多,概念理解也比较简单,在实际的应用中如果加以小心的求证,便可以灵活的掌握。

附件:http://down.51cto.com/data/2348618

本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/45564如需转载请自行联系原作者

lili00okok

模板模式(template)解析例子相关推荐

  1. c++模板模式template

    模板模式template 概念 应用场景 角色和职责 案例 概念 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承 ...

  2. 生成器模式(Builder)解析例子

    生成器模式属于对象结构型模式,其意图是将一个复杂对象的构建与他的表示分离,使得同样的构建创建过程可以创建不同的表示. 适用性: 1.         当创建复杂对象的算法应该独立于该对象的组成部分以及 ...

  3. 模板模式(Template)

    模板模式说明 模板是对多种事物的结构.形式.行为的模式化总结,而模板方法模式(Template Method)则是对一系列类行为(方法)的模式化 基类定义了一套模板(不可变),供子类继承,子类可以扩展 ...

  4. [设计模式](十):策略模式(Strategy)与模板模式(Template)详解及二者间区别介绍(两种父子类行为模式)

    这次要说的两个模式,都是行为模式,指的是在程序运行过程中,经过经验总结的行为开发模式. 其次,行为模式再按照类与类间关系的划分,可以划分为四个类型:父子关系(2种).独立类间关系(4种).类自身状态( ...

  5. 模板模式template

    模板模式:把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为 Template Method 模式一般应用在具有以下条件的应用中: 具有统一的操作步 ...

  6. 不重复发明轮子 -- 模板模式 (Template Pattern) 介绍 使用场景案例分析 优缺点 及代码演示

    一句话概括: 一个抽象类公开定义了执行它的方法的方式/模板,它的子类可以重写方法实现,但调用将以抽象类中定义的方式进行. 补充介绍: 模板模式(Template Pattern)使得子类可以不改变一个 ...

  7. 模板模式-Template Pattern

    一.定义 二.结构 三.实现 四. mybatis模板模式浅探之BaseExecutor 一.定义 一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义 ...

  8. Java模板模式(template)

      java23中设计模式中的模板模式是我们经常在框架源码中能看到的设计模式,所以本文就给大家来介绍下模板模式 模板模式 模板模式介绍   模板方法模式是编程中经常用得到的模式,它定义了一个操作中的算 ...

  9. C++设计模式之模板模式(template)(行为型)

    一 定义 模板方法模式是一种类的行为型模式,在它的结构图中只有类之间的继承关系,没有对象关联关系,模板方法模式(Template Method Pattern)官方定义:定义一个操作中的算法的框架,而 ...

最新文章

  1. Day25 linux shell中的特殊符号与命令
  2. 硬盘突然提示没有初始化_分享一下固态硬盘不认盘的修复方法
  3. vsftp配置日志及其启用本地时间
  4. leetcode 563. 二叉树的坡度(Java版)
  5. nginx配置url重写
  6. celerra(八)--Celerra Replication(下)
  7. [日推荐] 『地铁查询』全国地铁尽在手中,不怕迷路!
  8. Evernote CEO给想做长久公司创业者的3个建议
  9. 如何修复 MacBook Pro 电池寿命?
  10. 文本输入框的两种div+css的写法
  11. 高中计算机课程事例,【高中信息技术教学案例】_《高中信息技术新课程教学案例集》介绍...
  12. 手机微信收不到消息提醒,这样设置就能轻松解决
  13. photoshop序列号问题
  14. unity 自动寻路NavMesh
  15. 压缩png命令cmd_使用pngquant工具对PNG格式图片进行压缩
  16. JAVA-制作飞机大战遇到的问题
  17. 面向 C++ 的测试驱动开发
  18. lisp边长注记,求一个标注断开的lisp 和标注合并
  19. 设置VM启动顺序,使其进入BIOS
  20. 手机电脑维修管理系统

热门文章

  1. 健康日志之口腔粘膜----7-13
  2. 【翻译】SQL Server索引进阶:第八级,唯一索引
  3. JavaScript(3)之——对象的属性描述符
  4. Java Web中的Filter和Interceptor的区别
  5. Objective-C 内存管理之ARC规则
  6. struts2添加需要的jar包
  7. 实现点击在当前位置画一个黑点,打印出当前点击的坐标
  8. 《抓住听众心理——演讲者要知道的100件事》一20.人们学习的最优长度是20分钟...
  9. 站点选择技术RHI、DNS
  10. 王木匠,我服了你一半