1、模式简介

模版方法模式的定义:

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

模版方法模式的优点:

  • 封装不变部分,扩展可变部分;
  • 提取公共代码,便于维护;
  • 行为由父类控制,子类实现。

模版方法模式的缺点:

  每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

模版方法模式的适用场景:

  • 当类中有多个子类共有的方法,且逻辑相同时;
  • 当有重要的、复杂的方法时,可以考虑作为模板方法。

2、案例

  冲泡咖啡和冲泡茶叶都有相同的步骤:

  • 烧开水;
  • 冲泡;
  • 将咖啡/茶叶倒入到杯子中;
  • 加调料。

  因此,我们可以使用模版方法模式,将这些步骤提取出来作为模版使用。具体代码如下:

  制作饮料的抽象父类BeverageMaker,将烧水和倒入杯子的方法封装,冲泡和加调料的方法抽出作为接口方法。代码如下:

public abstract class BeverageMaker {

    public final void makeBeverage() {
boilWater();
brew();
putInCup();
addCondiments();
} // 烧水
protected void boilWater() {
System.out.println("烧水......");
} // 冲泡
protected abstract void brew(); // 倒入到杯子中
protected void putInCup() {
System.out.println("倒入杯中......");
} // 加调料
protected abstract void addCondiments();
}

  制作咖啡的方法类CoffeeMaker中的代码:

public class CoffeeMaker extends BeverageMaker {

    @Override
protected void brew() {
System.out.println("冲泡咖啡......");
} @Override
protected void addCondiments() {
System.out.println("添加牛奶......");
}
}

  制作茶的方法TeaMaker中的代码:

public class TeaMaker extends BeverageMaker {

    @Override
protected void brew() {
System.out.println("冲泡茶叶......");
} @Override
protected void addCondiments() {
System.out.println("添加柠檬......");
}
}

  测试类Test中的代码:

public class Test {
public static void main(String[] args) {
System.out.println("制作咖啡的步骤如下:");
BeverageMaker coffeeMaker = new CoffeeMaker();
coffeeMaker.makeBeverage(); System.out.println(); System.out.println("制作茶叶的步骤如下:");
BeverageMaker teaMaker = new TeaMaker();
teaMaker.makeBeverage();
}
}

  运行结果如下图所示:

  下面贴出模版方法模式代码的GitHub地址:【GitHub - Template】

【设计模式 - 23】之模版方法模式(Template)的更多相关文章

  1. 设计模式 笔记 模版方法模式 Template Method

    //---------------------------15/04/28---------------------------- //TemplateMethod 模版方法模式----类行为型模式 ...

  2. Head First 设计模式笔记(模版方法模式)

    1.定义: 在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中.模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 2.类图:  3.说明: 模版方法可以理解为一个方法里面包 ...

  3. 模版方法模式(Template Method)

    1.概念 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型 ...

  4. 《Head first设计模式》之模版方法模式

    模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 有些人没有咖啡就活不下去:有些人则离不开茶.两者共同的 ...

  5. 设计模式——模版方法模式详解(论沉迷LOL对学生的危害)

    .  实例介绍 在本例中,我们使用一个常见的场景,我们每个人都上了很多年学,中学大学硕士,有的人天生就是个天才,中学毕业就会微积分,因此得了诺贝尔数学奖:也有的人在大学里学了很多东西,过得很充实很满意 ...

  6. NET设计模式 第二部分 行为型模式(15):模版方法模式(Template Method)

    摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Te ...

  7. 设计模式之模版方法模式(Template Method Pattern)

    一.什么是模版方法模式? 首先,模版方法模式是用来封装算法骨架的,也就是算法流程 既然被称为模版,那么它肯定允许扩展类套用这个模版,为了应对变化,那么它也一定允许扩展类做一些改变 事实就是这样,模版方 ...

  8. 第13章 模版方法模式(Template Method)

    原文  第13章 模版方法模式(Template Method) 模板模式 模板模式 举例:模拟下数据库的update方法,先删除在插入. 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  9. .NET设计模式(16):模版方法(Template Method)(转)

    摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Te ...

随机推荐

  1. shutdown computer in ad and ou

    1. powershell Shutdown-computer –computername (gc c:\temp\serverlist.txt) –force –throttlelimit 10 h ...

  2. 什么是xsi:type ???

    http://www.w3.org/2001/XMLSchema-instance http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.ecli ...

  3. visual studio 2010 出现问题,不能设置断点调试了,一运行就未响应,然后程序退出

    经网络查找原因,怀疑是插件问题: 解决方案: 1.工具->扩展管理 2.禁用或卸载VS2010的插件(扩展程序)

  4. Spring 3整合Quartz 2实现定时任务一:常规整合 (基于maven构建)

    最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依 ...

  5. Java多线程初学者指南(9):为什么要进行数据同步

    Java中的变量分为两类:局部变量和类变量.局部变量是指在方法内定义的变量,如在run方法中定义的变量.对于这些变量来说,并不存在线程之间共享的问题.因此,它们不需要进行数据同步.类变量是在类中定义的 ...

  6. linux使用su切换用户提示 Authentication failure的解决方法& 复制文件时,报cp: omitting directory `XXX'

    linux使用su切换用户提示 Authentication failure的解决方法:这个问题产生的原因是由于ubtun系统默认是没有激活root用户的,需要我们手工进行操作,在命令行界面下,或者在 ...

  7. UML 中关系详解以及在visio中的表示

    http://www.cnblogs.com/kittywei/archive/2013/05/15/3079536.html

  8. android视频播放

    视频播放我们用到的是MediaPlayer,显示控件使用的surfaceView 我们向SD卡中先添加个视频文件,我的是xajh.3gp,不要用mp4,MP4会出现 should have subti ...

  9. 关于v$sql_bind_capture 的问题

    ---先清空shared_pool SQL> alter system flush shared_pool; System altered. SQL> col value_STRING f ...

  10. 你们都是怎么阅读android系统源码的,用什么工具?

    如果是eclipse,可以建立java或者c++工程,把framework源码导入.packages目录下的可以建立android工程.sourceinsight的话,建立工程把相应模块的代码添加进去 ...