参考书籍:Head First设计模式

什么是模板方法模式

定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

怎么理解这个定义呢?个人觉得这个定义主要有三个核心的点:

  1. 算法的骨架
  2. 步骤延迟到子类
  3. 子类在不改变算法结构的情况下,重新定义算法的某些步骤

什么是算法的骨架?

设计模式中举的例子是咖啡和茶的例子。冲泡咖啡和茶的流程如下:

冲泡咖啡步骤:把水煮沸----->用沸水冲泡咖啡----->把咖啡倒进杯子----->加糖和牛奶

冲泡茶步骤:

把水煮沸----->用沸水浸泡茶叶----->把茶倒进杯子----->加柠檬

仔细观察两种方式,发现咖啡和茶的冲泡法大致相同。这时候可以提炼(抽象)出一个冲泡饮品的流程出来,具体流程如下:(好比把大象装进冰箱要三步:1、把冰箱门打开2、把大象塞进去3、关上冰箱门)。

冲泡饮品:把水煮沸----->用热水泡饮品----->把饮料倒进杯子----->在饮料内加入适量的调料

我们把抽象出来的流程放进一个抽象类中供其子类(咖啡、茶等)使用,这个冲泡饮品的流程就可以称作为 算法的骨架。一般在抽象类中的表现形式如下:骨架方法 定义为final

 package tudou.javabasic.clone;

 /**
* Created by tudou on 2017-02-23.
*/
public abstract class CaffieineBeverage {
final void prepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
} protected abstract void addCondiments(); private void pourInCup() {
} protected abstract void brew(); private void boilWater() {
}
}

步骤延迟到子类

抽象类中只是对要操作的步骤进行了抽象,并没有全部去具体实现。相同的部分可以实现,例如:把饮品导入杯中(pourInCup)。不同的部分通过具体子类继承来单独实现。

重新定义算法的骨架-使用钩子

钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定。

有了钩子,子类能够决定要不要覆盖方法,如果不提供自己的方法,抽象类会提供一个默认的实现。

例如:Swing窗口程序中的钩子:paint()方法。在默认情况下paint()方法是不做事情的(即空实现)(JFrame的超类Component中对paint()进行了空实现),它是一个“钩子”,通过覆盖paint()方法,我们可以将自己的代码插入到JFrame的算法中,显示出想要的画面。

 public class MyFrame extends JFrame
{
public MyFrame(String titile)
{
super(titile);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(200, 200);
this.setVisible(true);
} @Override
public void paint(Graphics g)
{
super.paint(g);
g.drawString("paint() is a hook", 40, 100);
} public static void main(String[] args)
{
MyFrame f = new MyFrame("swing");
}
}

效果如下:

设计模式-模板方法模式(Head First)的更多相关文章

  1. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  2. 结合JDK源码看设计模式——模板方法模式

    前言: 相信很多人都听过一个问题:把大象关进冰箱门,需要几步? 第一,把冰箱门打开:第二,把大象放进去:第三,把冰箱门关上.我们可以看见,这个问题的答案回答的很有步骤.接下来我们介绍一种设计模式--模 ...

  3. 瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)

    简介 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template M ...

  4. C#设计模式-模板方法模式

    提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下 ...

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

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

  6. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  7. 深入浅出设计模式——模板方法模式(Template Method Pattern)

    模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式 ...

  8. javascript设计模式——模板方法模式

    前面的话 在javascript开发中用到继承的场景其实并不是很多,很多时候喜欢用mix-in的方式给对象扩展属性.但这不代表继承在javascript里没有用武之地,虽然没有真正的类和继承机制,但可 ...

  9. C++设计模式——模板方法模式

    模板方法模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不 ...

随机推荐

  1. Spring ——依赖注入配置一些知识点

    依赖注入 依赖注入的原理与实现 依赖注入(DI)和依赖查找(Dependency Lookup)共同组成 控制反转(IoC).从原理的角度来说,依赖注入和控制反转是没 有不同的,可以看作是从两个角度来 ...

  2. [js高手之路]html5 canvas动画教程 - 自己动手做一个类似windows的画图软件

    这个绘图工具,我还没有做完,不过已经实现了总架构,以及常见的简易图形绘制功能: 1,可以绘制直线,圆,矩形,正多边形[已完成] 2,填充颜色和描边颜色的选择[已完成] 3,描边和填充功能的选择[已完成 ...

  3. Java实用知识记录 —— 截止到Java8

    记录Java实用知识点,截止(包括)到Java8,只作概要的描述,不涉及到具体细节.变量:int.long的包装类支持无符号位操作,即其在内存中的位可以用来全部表示正数."_"可以 ...

  4. Web前端性能优化——如何有效提升静态文件的加载速度

    WeTest 导读 此文总结了笔者在Web静态资源方面的一些优化经验. 一.如何优化 用户在访问网页时, 最直观的感受就是页面内容出来的速度,我们要做的优化工作, 也主要是为了这个目标.那么为了提高页 ...

  5. Yii2之ListView小部件

    ListView是yii框架中类似GridView,也是用于展示多条数据的小部件,相比GridView,ListView可以更加灵活地设置数据展示的格式. 下面以我自己做的一个使用ListView来展 ...

  6. 我只是想获取access_token而已

    起因是想在微信小程序中获取access_token. 之前资源只有一个阿里云虚拟主机和一个域名,于是用C#后端写了GET请求的接口,准备调用自己域名下的接口获取access_token 使用微信的wx ...

  7. virualbox 安装 otter 必备软件

    前言 最近研究了一下阿里otter项目(分布式数据库同步),所以就在virualbox 上开始准备学习一下,遇到了不少坑,所以记录一下啊. otter 项目:https://github.com/al ...

  8. Python 爬虫:把廖雪峰教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天尝试写一个爬虫,将廖雪峰老师的 ...

  9. Codeforces Round #443 (Div. 2) C. Short Program

    C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  10. pycharm安装激活

    我的版本是pycharm-professional-2016.3.3 总体的安装步骤基本没什么,就是一直下一步,下一步就行了. 重要的最后的注册,找了一堆版本,最后用的server,注册成功. 注册码 ...