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. osg学习笔记3 简单几何模型

    osg::Geode (geometry node) osg::Geode类表示场景中的渲染几何叶节点,它包含了渲染用的几何信息,没有子节点. 要绘制的几何数据保存在osg::Geode管理的一组os ...

  2. WPF中如何使用图像API进行绘制

    首先,由于WPF中不象GDI+中有Graphics对象,因此你无法使用Graphics进行绘图了,取而代之的是:DrawingContext:类似地,GDI+中的OnPaint已被OnRender取代 ...

  3. vi 编辑器的使用

    1)    vi的自动对齐功能   我从window的网页上拷贝了一段代码到vi中,结果是不对齐的.见下图 此时为了对齐,我的做法是: ESC-v  进入视图模式,然后全选 再然后直接按 = 号. 然 ...

  4. 一个matlab数字图像处理程序的解释

    clc; %clc是清除command window里的内容 clear all; %clear是清除workspace里的变量 close all; %close all来关闭所有已经打开的图像窗口 ...

  5. ARM中的PC和AXD的PC

    R15 (PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令.一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC 总是指向第三条指令 ...

  6. linux线程(一)基本应用

    有感而发(可以直接忽略~):每次要用到线程,都要在网上重新学下基础,例子倒是不少:一种是排版好,讲的不全又不是自己想要的:一种是排版不好,直接略过了.两者兼有的又要苦苦寻找,所以还是自己总结了,觉得每 ...

  7. SEVERE: Error listenerStart

    转载:http://blog.sina.com.cn/s/blog_43eb83b90102e2k6.html# 今天启动Tomcat启动不了,报以下错:org.apache.catalina.cor ...

  8. 第 17 章 责任链模式【Chain of Responsibility Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父.既嫁从夫.夫死从子”,也就是说一个女性,在没有结婚的 ...

  9. [原博客] POI系列(4)

    正规.严谨.精妙. -POI BZOJ 1531 : [POI2005]Bank notes 裸的背包,可以二进制拆分一下.一个物品比如说有n个,可以拆成 1,2,4,8,16...个. OJ上没有样 ...

  10. JAVA与编译语言及解释语言的关系

    转自JAVA结合了编译和解释执行的优点 编译型语言是一次性编译成机器码,脱离开发环境独立运行,所以运行效率较高,但是由于编译成的是特定平台上机器码,所以可移植性差. 编译型语言的典型代表有C.C++. ...