定义:

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

结构:(书中图,侵删)

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

实例:

我瞬间就想到了很多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_ jiba、snownlp中文分词、pypinyin中文转拼音

    import jieba #导入jieba模块 x = '分词的准确度直接影响了后续文本处理和挖掘算法的最终效果.' jieba.cut(x) #使用默认词库进行分词 print(list(jieba ...

  2. Eclipse开发前,常用设置

    设置工作空间的项目编码, 防止出现乱码    Window - Preferences - General - Workspace    将"Text file encoding" ...

  3. linux netlink通信机制

    一.什么是Netlink通信机制  Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口. Netlink 是一种特殊的 s ...

  4. Alibaba(阿里) RocketMQ入门实例

    摘自:码友18年(www.mayou18.com) what is rocketMQ? RocketMQ作为一款分布式的消息中间件(阿里的说法是不遵循任何规范的,所以不能完全用JMS的那一套东西来看它 ...

  5. React Native系列(6) - 编译安卓私有React-Native代码

    为何要自己编译React Native安卓私有代码 我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见 React-Nat ...

  6. yii批量插入的方法

    public function insertSeveral($table, $array_columns) { $sql = ''; $params = array(); $i = 0; foreac ...

  7. Kafka基础

    简介 #概念:消息中间件(消息系统)      //消息系统分类:         点对点 消息队列(peer-to-peer)         发布/订阅 消息队列 消费者在消费时,是通过pull ...

  8. git fatal: 远程 origin 已经存在。

    不小心将git远程地址配错了,再次配置提示以下错误: fatal: 远程 origin 已经存在. 此时只需要将远程配置删除,重新添加即可: git remote rm origin git remo ...

  9. Java中的Unsafe类111

    1.Unsafe类介绍 Unsafe类是在sun.misc包下,不属于Java标准.但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty.Hadoo ...

  10. Java Script中常见操作

    字符串常见操作:obj.length 长度obj.trim() 移除空白obj.trimLeft()obj.trimRight)obj.charAt(n) 返回字符串中的第n个字符obj.concat ...