模板模式原理及案例分析

原创 2016年08月30日 15:54:56

  模板方法模式的规范化定义为:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

 

  从上面定义可以看出,模板方法是可以理解为一个算法的框架,而具体的计算数据却需要使用者来自行地添加。

 

  举一个模板方法的简单例子:制造杯子的工艺流程可以大致分为四步:准备材料,熔解材料,注入模具,冷却成型。现在我需要制作有把手和没把手两种型号的杯子,该怎么做呢?

 

  相必大家肯定会很快地想到将熔解后的材料注入相应的模具中,而结果正是如此。但是每种型号杯子都要全部实现四部流程吗?如果那样做,真的是太繁琐了。我们可以将其余三个公共的步骤集成到父类之中,成为一个固定的算法。而用子类来实现决定杯子型号的第三步。

 

  此外,一般情况下,模板模式的父类算法步骤中,都会带有一个所谓的“钩子”方法,此方法一般为空的方法,可以让子类的不同实现来对父类进行挂钩,要不要挂钩,则由子类来决定,在此案例中,我们允许有把手的杯子格外进行染色操作(挂钩),而不带把手的杯子则什么都不做。

 

  代码如下:

  这是实现固定算法的父类


public abstract class Cup {  
    public void makeCup() {  
        prepareMaterials();  
        meltMaterials();  
        intoMold();  
        cooling();  
        hook();  
    }  
  
    void prepareMaterials(){  
        System.out.println("prepare materials");  
    }  
  
    void meltMaterials(){  
        System.out.println("melt materials");  
    }  
  
    abstract void intoMold();  
  
    void cooling(){  
        System.out.println("cool model");  
    }  
  
    void hook(){}  
  
}


  带把手的杯子实现与不带把手的杯子实现。

 

public class CupwithHolder extends Cup{  
    public void intoMold(){  
        System.out.println("I have a holder");  
    }  
    @Override  
    public void hook(){  
        System.out.println("I need to become red");  
    }  
}  
  
public class CupwithoutHolder extends Cup{  
  
    public void intoMold(){  
        System.out.println("I do not have a holder");  
    }  
}

 运行类:

         

public class CupSimulator {  
  
    public static void main(String[] args){  
        CupwithHolder cupwithHolder = new CupwithHolder();  
        cupwithHolder.makeCup();  
  
        System.out.println("========================");  
  
        CupwithoutHolder cupwithoutHolder = new CupwithoutHolder();  
        cupwithoutHolder.makeCup();  
    }  
}

       最后的输出结果为:


prepare materials  
melt materials  
I have a holder  
cool model  
I need to become red  
========================  
prepare materials  
melt materials  
I do not have a holder  
cool model



     大家从这个例子中可以看到:在父类定义了一个算法的步骤,并允许子类来实现一个或多个步骤。之所以采用“允许”的字眼是因为其控制权是掌握在父类中的。

 

    由于模板方法始终强调算法的步骤,因此在spring源码中有着大量的应用,是很常用的设计模式。


     


版权声明:本文为博主原创文章,未经博主允许不得转载。

hibernate框架的结构和分析

在上篇博客中介绍了struts2框架的原理和流程分析,可以说struts框架一路走来,改变非常大,而且让我们开发人员变得更加轻松,里面的设计理念的改变也是让我们编程人员的思路得到更大的扩展。   ...
  • NeoAdrian
  • NeoAdrian
  • 2016年03月17日 14:11
  • 2489

Java代理模式详解及案例分析:静态代理/动态代理

标题:Java代理模式详解及案例分析:静态代理/动态代理 我们以几个问题,来开始我们今天的学习,如果下面几个问题,你都能说出个一二,那么恭喜你,你已经掌握了这方面的知识。 1,什么是代理模式? 2,...
  • reggergdsg
  • reggergdsg
  • 2016年11月03日 19:56
  • 1365

logistic回归原理解析及Python应用实例

logistic回归,又叫对数几率回归(从后文中便可此名由来)。首先给大家强调一点,这是一个分类模型而不是一个回归模型!下文开始将从不同方面讲解logistic回归的原理,随后分别使用梯度上升算法和随...
  • feilong_csdn
  • feilong_csdn
  • 2017年03月20日 17:59
  • 2308

《大型网站技术架构:核心原理与案例分析》拜读总结——第二章:大型网站架构模式

一:网站架构模式: 1.分层:将网站系统分为:应用层:负责具体业务和视图展示,如首页,搜索输入,结果展示     服务层:为应用层提供服务,如用户管理,购物车服务      数据层:数据...
  • zhuyong7
  • zhuyong7
  • 2017年05月25日 23:47
  • 177

大型网站技术架构:核心原理与案例分析—第二章:大型网站架构模式

HTML静态化、图片服务器分离、数据库集群和库表散列、缓存、镜像、负载均衡  大型网站,比如门户网站。在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性...
  • nuli888
  • nuli888
  • 2016年08月02日 11:26
  • 360

模板方法模式案例代码

  • 2013年03月17日 23:42
  • 1KB
  • 下载

正则表达式match和group的区别 具有相同模式的字符串使用组的提取案例及原理

Match类 示例:查找出字符串中包含的url string text = "FirstUrl: http://www.sohu.com ,SecondUrl: http://www.baidu....
  • GoodShot
  • GoodShot
  • 2015年04月08日 07:42
  • 5312

Java设计模式之模板方法设计模式(银行计息案例)

不知道为什么,这几天对Java中的设计模式非常感兴趣,恰巧呢这几天公司的开发任务还不算太多,趁着有时间昨天又把模板方法模式深入学习了一下,做了一个客户在不同银行计息的小案例,感触颇深,今天给各位分享一...
  • bzt820801
  • bzt820801
  • 2017年08月06日 18:48
  • 229

JAVA模板方法设计模式(从现实生活角度理解代码原理)

概述: 定义一个功能的框架(骨架),一部分功能是确定的,一部分功能是不确定的,先把确定的部分实现,把不确定的部分延迟到子类中实现。 实现该模式的关键步骤: 第一步:抽象类,实现模板方法,定义...
  • panhouye
  • panhouye
  • 2016年12月03日 20:25
  • 160

电子商务经纪模式案例分析ppt

  • 2013年12月24日 12:52
  • 3.95MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模板模式原理及案例分析
举报原因:
原因补充:

(最多只允许输入30个字)