关闭

Java模板模式(Template模式)

503人阅读 评论(0) 收藏 举报
分类:
模板方法
 概述
    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
    
    TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
 适用性
    1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

    2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
      首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。
      最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

    3.控制子类扩展。
			
 参与者
    1.AbstractClass
      定义抽象的原语操作(primitiveoperation),具体的子类将重定义它们以实现一个算法的各步骤。
      实现一个模板方法,定义一个算法的骨架。
      该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。

    2.ConcreteClass
      实现原语操作以完成算法中与特定子类相关的步骤。
 类图
 例子
AbstractClass
public abstract class Template {

    public abstract void print();
    
    public void update() {
        System.out.println("开始打印");
        for (int i = 0; i < 10; i++) {
            print();
        }
    }
}
ConcreteClass
public class TemplateConcrete extends Template {

    @Override
    public void print() {
        System.out.println("这是子类的实现");
    }
}
Test
public class Test {

    public static void main(String[] args) {
        Template temp = new TemplateConcrete();
        temp.update();
    }
}
result
开始打印
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现


Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。

其实Java的抽象类本来就是Template模式,因此使用很普遍。而且很容易理解和使用,我们直接以示例开始:
public abstract class Benchmark
{
  /**
  * 下面操作是我们希望在子类中完成
  */
  public abstract void benchmark();

  /**
  * 重复执行benchmark次数
  */
  public final long repeat (int count) {
    if (count <= 0)
      return 0;
    else {
      long startTime = System.currentTimeMillis();
            for (int i = 0; i < count; i++)
          benchmark();
                long stopTime = System.currentTimeMillis();
                return stopTime - startTime;
          }
        }
}


在上例中,我们希望重复执行benchmark()操作,但是对benchmark()的具体内容没有说明,而是延迟到其子类中描述:
public class MethodBenchmark extends Benchmark
{
  /**
  * 真正定义benchmark内容
  */
  public void benchmark() {
    for (int i = 0; i < Integer.MAX_VALUE; i++){
      System.out.printtln("i="+i);    
       }
  }
}


至此,Template模式已经完成,是不是很简单?看看如何使用:
    Benchmark operation = new MethodBenchmark();
    long duration = operation.repeat(Integer.parseInt(args[0].trim()));
    System.out.println("The operation took " + duration + " milliseconds");

也许你以前还疑惑抽象类有什么用,现在你应该彻底明白了吧?至于这样做的好处,很显然啊,扩展性强,以后Benchmark内容变化,我只要再做一个继承子类就可以,不必修改其他应用代码。

1
0
查看评论

C++设计模式实现--模板(Template)模式

一. 问题 在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。Template提供了这种情况的一个实现框架。 二. 模式 Template 模式是采用继承...
  • L_Andy
  • L_Andy
  • 2014-06-13 16:00
  • 1255

模板方法模式(Template Method) - 最易懂的设计模式解析

前言今天我来全面总结一下Android开发中最常用的设计模式 - 模板方法模式。 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(SimpleFactoryPattern)- 最易懂的设计模式解析 工厂...
  • carson_ho
  • carson_ho
  • 2017-02-07 15:37
  • 5143

Java设计模式之模板(template)方法模式

一,概述 这是写的第二遍Java设计模式的解析了,不过与其说是解析,不如说是自己写的一个Demo,一篇个人笔记。 二,对模板方法模式的一些个人理解 模板方法模式是结构最简单的行为型模式,有时,我们完成一件事情时次序是固定的,只有有些步骤确实变化的。比如,当我们去银行办业务时,就是a排队取号...
  • bighuan
  • bighuan
  • 2017-03-17 22:41
  • 269

Strategy模式和Template Method模式的异同浅析

一、Strategy模式 1. 特点说明: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。适用场景: 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。需要使用一个算法的不同变体。算法使用客户不应该知道的数据。使
  • aheroofeast
  • aheroofeast
  • 2011-08-19 20:16
  • 3105

奇异递归模板模式( Curiously Recurring Template Pattern,CRTP)1

1.CRTP介绍奇异递归模板模式(curiously recurring template pattern,CRTP)是C++模板编程时的一种惯用法(idiom):把派生类作为基类的模板参数。更一般地被称作F-bound polymorphism,是一类F 界量化,相关介绍可以参考 wiki 奇异递...
  • gfsfg8545
  • gfsfg8545
  • 2017-06-25 19:39
  • 3033

TemplateMethod模板方法模式之应用

一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。            二,类图:       ...
  • liujiahan629629
  • liujiahan629629
  • 2014-02-22 19:37
  • 2363

设计模式之模板方法模式(C++)

模板方法:定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以再不改变一个算法的结构即可重新定义该算法的某些特定步骤。通过把不变的行为搬移到基类中,去除了子类的重复代码,提供了一个很好的代码复用解决方案。 通用模板方法的UML类图 模板方法是将原来不变的行为和可变的行为...
  • hailong0715
  • hailong0715
  • 2016-07-12 15:05
  • 311

模板方法模式例子

原文地址:http://www.cnblogs.com/jenkinschan/p/5768760.html一、概述 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。二、结构类图三、解决问题模板方法就是提供...
  • disiwei1012
  • disiwei1012
  • 2016-12-05 17:14
  • 898

Java设计模式之模板方法模式(Template Method)

本文属于23种设计模式系列,介绍的是模板方法模式。
  • jason0539
  • jason0539
  • 2015-04-15 08:37
  • 28556

【java设计模式】之 模板方法(Template Method)模式

1. 模板方法的一个实例         这一节主要来学习一下设计模式中的模板方法模式。我们先来看一个例子:假如现在老板让你做一个汽车的模型,要求只要完成基本功能即可,不考虑扩展性,那你会怎么做呢?我们首先会根据经验设...
  • eson_15
  • eson_15
  • 2016-05-06 08:57
  • 4088
    个人资料
    • 访问:194680次
    • 积分:3320
    • 等级:
    • 排名:第12104名
    • 原创:85篇
    • 转载:325篇
    • 译文:0篇
    • 评论:14条
    博客专栏
    最新评论