在讲模板模式原理前,我们按照管理,先来个生活中例子。茶馆需要开发一个自动的泡咖啡和泡茶的程序。
本文出自:《凯哥学设计模式》系列教程中的模板模式一
我们先来看看泡咖啡和泡茶的步骤:
我们根据上图写代码实现:
泡咖啡类,如下图:
泡茶类如下图:
测试类:
运行结果:
很简单。也很容易写出来。写出来很清楚。
从上图中,可以发现,两个流程几乎是一样的套路(步骤)。其中,不变的部分:水烧开、倒入杯子、送给客人。这三步是不变的。
变化的是:冲咖啡还是泡茶叶;加糖/牛奶还是加柠檬这两个步骤是变化的。
项目进化第一个版本:
我们将不变的抽取出来,放到一个公共的类中。HotDrink。然后让coffe和tea都继承公共的类。得到的类图如下:
hotdrink超类代码如下:
项目进化第二个版本:
经过分析,我们发现,两个流程的还有相同的地方:
1.两个流程的步骤都一样(都是五个步骤的);
2.无论泡茶还是泡咖啡都是brew操作;
3.无论加糖还是加柠檬都是添加调料的。
所以,我们对项目在进行一次提取:
我们将操作流程也提取到超类中,将2和3操作也放到超类中。让子类具体实现。所以得到类图如下:
我们来看看这次hotdrink类里面:
public abstract class HotDrink {
public final void prepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
send();
}
protected abstract void addCondiments();
protected abstract void brew();
private final void boilWater() {
System.out.println("一.烧水");
}
private final void pourInCup() {
System.out.println("三.倒入杯中");
}
我们发现,在prepareRecipe方法和boilWter、pourInCup、send这四个操作都添加了final关键字来修改。这是为什么呢?
从上面分析,我们知道,都是五个步骤,而且五个步骤中的三个步骤(烧水、倒入杯中、送客人)也是固定不变的。那么,在Java中,固定不变的这个怎么表示呢?对了,就使用fianl这个关键字修饰就可以了。这样,就可以放置子类不能随便修改步骤(比如由五步变成三步),已经规定的不能在修改了。比如烧水这个不烧了,这样是不行的。
我们来看看,热饮coffee和tea的类:
hotDrinkTea:
测试方法:
运行结果:
我们对项目进化进行复盘总结,可以得到:
所谓的模板模式:封装了一个算法的步骤,并允许子类为一个或多个步骤方法提供实现。模板模式,可以使子类在不改变算法结构(如上面的五步)的情况下,重新定义算法中某些步骤(如上面的第二步和第四步)
模板模式类图如下:
类图说明:
1:是一个抽象类(如:hotDrink)
2:有个模板方法。这个模板方法是final的(如:prepareRecipe方法)
3:由三种方法:
AbsOperation:抽象的方法(泡咖啡、加牛奶)
concreteOp:具体的方法(如烧水。可以是final的也可以不是)
hook:钩子。可以选的子类可以覆盖父类的方法。
我们来演示下带有hook的。
比如,现在有了新需求,客户可以自己选择需不需要添加调料。这个怎么做呢?
本文来源:
凯哥Java(kaigejava)
凯哥个人博客:www.kaigejava.com
我们从新定义模板:
tea实现了该模板类,并且不加柠檬的:
测试运行:
结果:
相关推荐
### 设计模式之模板方法模式解析 #### 一、引言 在软件开发过程中,我们经常面临这样的场景:有一些步骤是固定的,而某些步骤则可能因具体实现而异。为了解决这类问题,设计模式中引入了一种叫做“模板方法模式”的...
在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来理解模板方法的定义 1. 模板方法模式的定义 模板方法模式——在一个抽象类中定义...
文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...
在深入浅出Java设计模式的高清中文PDF文件中,首先以一个生活化的例子引出了工厂模式的概念,介绍了工厂模式在面向对象编程中的重要性和实用性。文档详细讲解了20多种Java设计模式,并且在讲解的过程中包含了丰富的...
《Head First 设计模式》这本书的独特之处在于其寓教于乐的教学方式,书中运用了大量的图像、故事和游戏,使得枯燥的理论变得生动有趣。例如,书中可能通过“披萨店”这个例子来解释工厂模式,通过“动物园”来阐述...
设计鸭子行为时,作者引入了行为设计模式的概念,特别是行为模式中的策略模式,允许鸭子在运行时动态地改变其行为。作者指出,使用接口比继承更加灵活,这就是“HAS-A”关系优于“IS-A”关系的实例。在这一章节的...
在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来理解模板方法的定义。 二、模板方法模式详细介绍 2.1 模板方法模式的定义 模板...
以上介绍的设计模式不仅有助于提高代码质量和可维护性,还能帮助你在日常生活中更加灵活地应对各种情况。希望通过对这些设计模式的学习,你能更好地应用到自己的项目中,并在追求女孩的过程中也能有所启发。
本书作者Eric Freeman;ElElisabeth Freeman是作家、讲师和技术顾问。本书的产品设计应用神经生物学、认知科学,... 12复合模式模式中的模型 13与设计模式相处真实世界中的模式 附录A:剩下的模式 索引……
设计模式是软件开发中解决常见问题的模板或蓝图,它们有助于编写结构清晰、易于维护的代码。在JavaScript中使用设计模式可以提升代码的效率和可处理性,有助于应对变化多端的编程挑战。 #### 5. JavaScript的灵活性...
总的来说,设计模式是软件开发中的宝贵工具,它们提供了解决复杂问题的模板,使我们的代码更易于维护、扩展和理解。无论是策略模式还是装饰者模式,掌握它们都将对提升你的编程技能和设计思维大有裨益。通过不断的...
本书结合认知科学原理和神经生物学研究,采用引导式教学方法,通过故事和生活化的例子将设计模式的精髓深入浅出地传达给读者。书中不仅涉及了23个经典的设计模式,还融合了UML类图、实例代码以及大量的插图和幽默的...
享元模式:在天猫商城里存在着成天上万的网店,但是天猫所提供的网站模板是一样的,存在许多天猫网店使用同一个网店模板的情况,如果每一个网店都用一个网店对象来表示,因为网店数量巨大,我们需求很
在IT行业中,设计模式是软件开发中的重要概念,它们代表了在特定情境下解决常见问题的最佳实践。23种GOF(GoF,Gang of Four)设计模式是被广泛接受和使用的,这些模式来自于Erich Gamma、Richard Helm、Ralph ...
标题和描述中的“追MM与23种设计模式”巧妙地将追求恋人的社交情境与软件工程中的设计...这些设计模式不仅对软件开发人员有着重要的指导意义,也向我们展示了如何将抽象的概念与现实生活联系起来,使之更加生动有趣。
设计模式是软件开发中的一种重要概念,它们是解决常见问题的最佳实践和模板。这份复习题主要涉及了设计模式的不同方面,包括优缺点、分类、实际应用以及与其他模式的区别。 首先,工厂模式是一种创建型设计模式,它...
设计模式是解决软件设计问题的典型方法的模板,它不是可以直接翻译成代码的模板,而是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的总结。设计模式可以提升代码的可重用性,增加代码的可读性和可维护性...
设计模式是一种在特定上下文中已被证明有效的解决方案模板,它描述了如何在软件设计中解决常见问题。设计模式不是可以直接复用的代码,而是一种通用的语言,用于交流和传授编程经验。 2. **C#中的面向对象编程**:...
设计模式是软件开发中经常使用的一种通用解决方案模板,用于解决特定上下文中的常见问题。它们源于设计模式的研究,通常被认为是软件设计中的最佳实践。 首先,学习方法要正确。理解模式的意图,即它的目的是什么,...
本章将设计模式的应用带入了现实生活中的例子,展示了如何在真实的项目中应用这些模式来解决问题。通过具体案例,读者可以更好地理解设计模式的实际价值。 #### 第14章:附录:剩余的模式 最后,本书还提供了一个...