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. foxmial 和 outlook设置问题

    您可以使用支持POP3的客户端软件(例如Foxmail或Outlook)收发您的邮件.请配置您的电子邮件客户端,以下载QQ邮箱邮件. 了解如何进行配置,请单击您的电子邮件客户端名称: Foxmail设 ...

  2. 剑指Offer(书):链表的倒数第K个节点

    题目:输入一个链表,输出该链表中倒数第k个结点. 分析:要注意三点:链表为空:链表个数小于k:k的值<=0; public ListNode FindKthToTail(ListNode hea ...

  3. opencv中ptr的使用

    #include <QCoreApplication> #include<stdio.h> #include<opencv2/highgui/highgui.hpp> ...

  4. PAT Basic 1019

    1019 数字黑洞 给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有“数字 ...

  5. ASP.NET MVC 通用角色权限管理系统

    RightControl 介绍 .NET 通用后台角色权限管理系统,已完成.项目地址:http://106.14.77.184/Admin/Login 码云地址:https://gitee.com/L ...

  6. Oracle中Restore和Recovery的区别

    一.参考解释一 在Oracle的备份与恢复的知识点中,经常会出现Restore 和 Recovery两个词. 由于这两个词在字典中的解释很接近,困扰了我很久.直到我在Oracle的官方文档中看到了以下 ...

  7. Spark——为数据分析处理提供更为灵活的赋能

    本文来自网易云社区 作者:王佳楠 一.概述 现如今在大规模数据处理分析的技术领域中,Hadoop及其生态内的各功能组件占据了绝对的统治地位.Hadoop原生的MapReduce计算框架由于任务抽象简单 ...

  8. xfce-openvas9

    1安装OpenVas 第一步,添加PPA源,在这我用的是一台新装的Ubuntu安装OpenVas,运行以下命令就可以进行安装 root@ubuntu:~# add-apt-repository ppa ...

  9. iOS NSLog各种打印

    %@ 对象 %d,%i 整型 (%i的老写法) %hd 短整型 %ld , %lld 长整型 %u 无符整型 %f 浮点型和double型 %0.2f 精度浮点数,只保留两位小数 %x:    为32 ...

  10. 黑匣子_NOI导刊2010提高 (对顶堆)

    题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...