template method(模板方法)模式是一种行为型设计模式。它在一个方法中定义了算法的骨架(这种方法被称为template method。模板方法),并将算法的详细步骤放到子类中去实现。template method使得子类能够不改变一个算法的结构就可以重定义该算法的某些特定步骤。

须要指出的是,这里所说的template并非c++中的模板

适用性

算法的骨架事先已确定,仅仅是算法的某些步骤的详细实如今不同的子类中有所不同

优点

  • 算法的基本骨架已确定,子类能够方便地实现算法的变体
  • 避免代码的反复,算法的步骤已经在父类中定义。子类依据须要仅仅须实现某些步骤就可以

应用

template method常常被应用在框架(framework)中,在框架中定义了通用的实现和基础的功能,并为详细的实现预留了“占位符”,框架的使用者仅仅须要又一次定义这些“占位符”就可以。

实现

首先我们定义一个抽象类Game。

在Game类中定义了一个声明为final的template method: play()。

play()方法包括了三个方法的调用,分别为initialize(),startPlay(),endPlay(),这三个方法都声明为abstract类型,表明在子类中须要详细实现这些方法。

Game.java

public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay(); // template method
public final void play(){ // initialize the game
initialize(); // start game
startPlay(); // end game
endPlay();
}
}

接着。我们定义了Basketball和Football类,它们都是Game的子类,并重写了当中的initialize()。startPlay()。endPlay()方法。

Basketball.java

public class Basketball extends Game {

   @Override
void endPlay() {
System.out.println("Basketball Game Finished!");
} @Override
void initialize() {
System.out.println("Basketball Game Initialized! Start playing.");
} @Override
void startPlay() {
System.out.println("Basketball Game Started. Enjoy the game!");
}
}

Football.java

public class Football extends Game {

   @Override
void endPlay() {
System.out.println("Football Game Finished!");
} @Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
} @Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
}

最后,我们编写測试类,例如以下:

TemplatePatternDemo.java

public class TemplatePatternDemo {
public static void main(String[] args) { Game game = new Basketball();
game.play();
System.out.println();
game = new Football();
game.play();
}
}

程序的输出例如以下:

Basketball Game Initialized! Start playing.

Basketball Game Started. Enjoy the game!

Basketball Game Finished!

Football Game Initialized! Start playing.

Football Game Started. Enjoy the game!

Football Game Finished!

參考资料

  1. https://en.wikipedia.org/wiki/Template_method_pattern
  2. http://www.javacodegeeks.com/2013/03/template-method-design-pattern-in-java.html
  3. http://www.tutorialspoint.com/design_pattern/template_pattern.htm

封装算法: 模板方法(Template Method)模式的更多相关文章

  1. 行为型设计模式之模板方法(TEMPLATE METHOD)模式 ,策略(Strategy )模式

    1 模板方法(TEMPLATE METHOD)模式: 模板方法模式把我们不知道具体实现的步聚封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具体方法统称为模板方法),这样构成一个抽象基类.子 ...

  2. 一天一个设计模式——模板方法(Template Method)模式

    一.模式说明 现实世界中的模板是用于将事物的结构规律予以固定化.标准化的成果,它体现了结构形式的标准化.例如镂空文字印刷的模板,通过某个模板印刷出来的文字字体大小都是一模一样,但是具体使用什么材质的颜 ...

  3. 模板方法(Template Method)(父类声明算法骨架,子类具体不同实现)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  4. 设计模式之---模板方法template method的使用

    在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的.Template Method ...

  5. 设计模式Template Method模式(Template Method)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还 ...

  6. 行为型模式之Template Method模式

    模板方法模式(Template Method Pattern) 又叫模板模式,通过定义一个操作的算法骨架,而将一些步骤延迟到子类中,可以不改变一个算法的结构,却又可以重新定义概算法的某些特定步骤. 应 ...

  7. 宋宝华:Linux设备驱动框架里的设计模式之——模板方法(Template Method)

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前言 <设计模式>这本经典 ...

  8. 设计模式二--模板方法Template method

    模式分类: 书籍推荐:重构-改善既有代码的设计 重构获得模式 设计模式:现代软件设计的特征是"需求的频繁变化".设计模式的要点是 "寻找变化点,然后在变化点处应用设计模式 ...

  9. Template Method模式和Strategy模式[继承与委托]

    继承 program by difference. 通过继承,可以建立完整的软件结构分层.其中每一层都可以重用该层次以上的Code. 过度使用继承的代价是巨大的.应使用组合或者委托来替代继承. Tem ...

随机推荐

  1. Linux 权限设置和 SUID, SGID 以及粘滞位sticky bit

    suid是指在执行suid程序的过程中,去访问其他文件时拥有suid程序属主的权限,而不是指对suid程序本身拥有suid程序属主的权限! 一. Linux 文件权限的表示方法 文件权限用 12 个二 ...

  2. expdp / impdp 用法详解(Oracle)

    一 .关于expdp和impdp     使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工 ...

  3. NYOJ 1023 还是回文

    还是回文 时间限制:2000 ms  |  内存限制:65535 KB 难度:3   描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一 ...

  4. LINQ-查询表达式基础

    一.LINQ查询的数据源 从应用程序的角度来看,原始源数据的特定类型和结构并不重要. 应用程序始终将源数据视为 IEnumerable<T> 或 IQueryable<T> 集 ...

  5. 九度oj 题目1250:矩阵变换

    题目描述: 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一, 现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到. 输入: 输出: 如果可以 ...

  6. leetcode 376

    利用贪心思想,每次都得到到当前数最长的长度,和与当前数链接的前一个数之间差的符号 class Solution { public: int wiggleMaxLength(vector<int& ...

  7. ObjectDataSource配合存储过程(采用数据集)的使用(删除可以解决,但是编辑出错好像它的方法也无法解决

    原文发布时间为:2008-08-01 -- 来源于本人的百度文章 [由搬家工具导入] ObjectDataSource是比较有意思的一个东西 通过在网络上遍访各位高手,终于自己有了一些心得体会。现总结 ...

  8. Python入门--10--序列

    一.与列表.元祖的相同与不同 1.都可以通索引得到元素 2.默认索引从0开始 3.可以通过分片得到一个范围内的元素集合 4.有很多共同的操作符 二. 1.list()这个函数用法 a="we ...

  9. HUNAN 11562 The Triangle Division of the Convex Polygon(大卡特兰数)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11562&courseid=0 求n边形分解成三角形的 ...

  10. Debian9初始配置

    1 进入root用户 su root 2 修改镜像源:编辑/etc/apt/sources.list文件 nano /etc/apt/sources.list 修改内容如下: deb http://m ...