定义:

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

结构:(书中图,侵删)

一个定义整体框架的父类
若干不同具体实现的子类

实例:

我瞬间就想到了很多RPG游戏。
不同职业在新手村完成任务,最多就是打的怪名字不一样、不同职业奖励的装备不一样子类的。
基本上都是一个套路。
 
接下来用代码实现:
为了代码简洁,我就设置一个任务,以及两个职业:战士、法师。
 
新手村任务框架类:
package designpattern.templatemethod;

public abstract class NoviceVillage {
public void Task1() {
System.out.println("你好,勇士。请帮我杀掉10个" + Task1Aim());
}
public void underWay() {
System.out.println("任务进行中...");
}
public void Task1Reward() {
System.out.println("太好了,勇士!非常感谢,这是您的报酬:金币*50、经验*500、" + Task1RewardWeapon());
} abstract String Task1Aim(); abstract String Task1RewardWeapon();
}
战士的任务类:

package designpattern.templatemethod;

public class NoviceVillageWarrior extends NoviceVillage{

    @Override
String Task1Aim() {
return "老虎怪";
} @Override
String Task1RewardWeapon() {
return "新手巨剑*1";
} }
法师的任务类:

package designpattern.templatemethod;

public class NoviceVillageWizard extends NoviceVillage{

    @Override
String Task1Aim() {
return "猴子精";
} @Override
String Task1RewardWeapon() {
return "新手法杖*1";
} }
客户端:
package designpattern.templatemethod;

public class Client {
public static void main(String[] args) {
// 战士
NoviceVillage noviceVillageWarrior = new NoviceVillageWarrior();
noviceVillageWarrior.Task1();
noviceVillageWarrior.underWay();
noviceVillageWarrior.Task1Reward(); System.out.println("=================================="); // 法师
NoviceVillage noviceVillageWizard = new NoviceVillageWizard();
noviceVillageWizard.Task1();
noviceVillageWizard.underWay();
noviceVillageWizard.Task1Reward();
}
}

输出结果:

你好,勇士。请帮我杀掉10个老虎怪
任务进行中...
太好了,勇士!非常感谢,这是您的报酬:金币*50、经验*500、新手巨剑*1
==================================
你好,勇士。请帮我杀掉10个猴子精
任务进行中...
太好了,勇士!非常感谢,这是您的报酬:金币*50、经验*500、新手法杖*1

总结:

感觉这个设计模式在平时多多少少都见到或者用到过,只是不知道这也是一个设计模式。
这个设计模式的精髓就是整体的框架是不变的,但是里面某些细节会有不同,这时候就需要用到模板方法设计模式。
可以大大提高代码的复用性,以及减少代码的大面积重复。

设计模式 | 模板方法模式(template method)的更多相关文章

  1. 设计模式 - 模板方法模式(template method pattern) JFrame 具体解释

    模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(templ ...

  2. 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释

    模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...

  3. 设计模式 - 模板方法模式(template method pattern) 具体解释

    模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...

  4. java设计模式 模板方法模式Template Method

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...

  5. C#设计模式-模板方法模式(Template Method)

    概念 模板指一些可以套用的公共内容,例如网页模板是当网站中有许多页面版式色彩相同的情况下,将其定义为网页模板,并定义其中部分可编辑,部分不可编辑,那么在利用网页模板制作其他页面时就会很方便,不易出错. ...

  6. 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

      设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...

  7. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  8. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图   相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...

  9. 二十四种设计模式:模板方法模式(Template Method Pattern)

    模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...

  10. 模板方法模式(Template Method Pattern)——复杂流程步骤的设计

    模式概述 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单. 在 ...

随机推荐

  1. Python_数据整理与写入

    ''' 假设文件data.txt中有若干整数,整数之间使用英文逗号分隔.编写程序读取所有整数,将其按升序后再写入文本文件datta_asc.txt中 ''' import random countNu ...

  2. Python_生成大量随机信息

    #coding=utf-8 import random import string import codecs ''' 演示如何使用Python标准库random来生成随机数据,这在需要 ''' #常 ...

  3. 【Service Fabric】小白入门记录 本地Service Fabric集群安装及设置

    本篇内容是自学自记,现在我还不知道Service Fabric究竟是怎么个入门法,反正按照入门教程先进行本地Service Fabric集群的安装,万里路始于足下,要学习总得先把环境装好了才能开始学习 ...

  4. Mysql主从方案的实现

    Mysql主从方案介绍 mysql主从方案主要作用: 读写分离,使数据库能支撑更大的并发.在报表中尤其重要.由于部分报表sql语句非常的慢,导致锁表,影响前台服务.如果前台使用master,报表使用s ...

  5. java中判断文件及所在文件夹是否存在

    File file=new File(filePath);if (file.exists()) {}else { File fileParent =new File(file.getParent()) ...

  6. 在webpack里使用jquery.mCustomScrollbar插件

    malihu-custom-scrollbar-plugin是一个依赖jquery的自定义网页滚动条样式插件 网站:http://manos.malihu.gr/jquery-custom-conte ...

  7. 「SDOI 2018」战略游戏

    题目大意: 给一个$G=(V,E)$,满足$|V|=n$,$|E|=m$,且保证图联通,有Q个询问,每组询问有s个点,求图中有多少点满足:将其删去后,这s个点中存在一对点集$(a,b)$不联通且删去点 ...

  8. BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈

    BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈 Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai ...

  9. linux系统日志查看

    系统 日志文件( 可以通过cat 或tail 命令来查看) /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一/var/log/secure ...

  10. DCGAN 代码简单解读

    之前在DCGAN文章简单解读里说明了DCGAN的原理.本次来实现一个DCGAN,并在数据集上实际测试它的效果.本次的代码来自github开源代码DCGAN-tensorflow,感谢carpedm20 ...