一、什么情况下考虑使用“模板方法模式”?
当我们设计一个算法时,如果已经确定了算法的关键步骤和执行顺序,只是算法步骤的具体实现需要根据不同的情况,具体分配,此时我们可以考虑使用“模板方法模式”。
模板方法模式的概念:
在一个方法中定义个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
其中AbstractClass中templateMethod()中,调用了调用了两个原语操作。这样就可以实现模板方法本身和这两个操作的具体实现解耦了。
二、如何实现模板方法模式?
考虑如下场景某休闲茶吧出售咖啡与茉莉花茶。而厨师准备咖啡和茉莉花茶的方法大致相同为:
把水煮沸;冲泡(咖啡或茉莉花);冲泡之后导入杯子;添加调味品(牛奶或柠檬)。这一场景就可以应用模板方法模式。
① 首先建立以抽象类定义模板方法,由于把水煮沸与冲泡后导入杯子,二者操作相同可以直接在抽象类中实现。
public abstract class CaffeineBeverage { protected final void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments(); } protected void boilWater() { System.out.println("Boiling water..."); } protected abstract void brew(); protected void pourInCup() { System.out.println("Pouring into cup..."); } protected abstract void addCondiments(); }
一般把模板方法定义为final方法,避免子类的复写。
②定义咖啡或茉莉花茶
public class Coffee extends CaffeineBeverage { @Override protected void brew() { System.out.println("Dripping coffee through filter..."); } @Override protected void addCondiments() { System.out.println("Adding milk..."); } }
public class Tea extends CaffeineBeverage { @Override protected void brew() { System.out.println("Steeping the tea..."); } @Override protected void addCondiments() { System.out.println("Adding Lemon"); } }
模板方法模式还有另一种应用,我们可以在抽象类中定义具体的方法,可以什么也不做或者做默认的事情,我们称之为“钩子”,子类可以选择要不要覆盖它从而对模板方法的执行过程产生影响。
eg:我们为可以为抽象类添加顾客是否同意添加调味品的方法,默认为同意:
protected boolean customerWantsCondiments() { return true; }
protected final void prepareRecipe() { boilWater(); brew(); pourInCup(); if (customerWantsCondiments()) addCondiments(); }
这样子类通过覆盖方法customerWantsCondiments()方法对模板方法的流程产生影响。
模板方法模式与策略模式:
二者都可以让子类自主的选择采用哪个行为,但是模板方法模式具有较强的控制力,子类可以选择性的实现特定的步骤,但是算法的整体骨架不会改变,这里采用的是继承实现的。然而策略模式采用的是组合实现的,所以具有更强的灵活性,可以在运行时传入不同的策略对象实现不同的行为。
相关推荐
在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在不修改原有对象的基础上,为对象添加额外的功能或者...
本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...
10. 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 11. 责任链模式:允许将请求沿着处理者链进行传递,直到某个处理者...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
《Java设计模式》是刘伟老师的一本经典教材,它深入浅出地讲解了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的通用解决方案,是软件开发中的智慧结晶。这本书的课后习题和...
总结来说,模板方法模式是Java设计模式中的一种常见模式,用于定义算法的结构,并允许子类在不改变整体结构的情况下重定义某些步骤。在这个悍马模型的例子中,通过调整`run()`方法的实现位置,可以更好地体现模板...
### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...
- **模板方法模式** - **观察者模式** - **命令模式** - **迭代器模式** - **访问者模式** - **中介者模式** - **备忘录模式** - **状态模式** - **解释器模式** 除了这23种经典设计模式之外,还有其他...
在给定的PPT内容中,首先通过一个简单的生活实例——泡咖啡与泡茶的过程——来引入模板方法模式的应用场景。无论是泡咖啡还是泡茶,都有几个共同的步骤: 1. **烧开水**:这是泡咖啡和泡茶都必需的。 2. **泡制过程*...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。在这个压缩包文件“DesignPatterns”中,很可能包含了各种Java设计模式的源代码实现。...
本篇文章将探讨如何利用设计模式中的模板方法模式来实现数据库访问层,以简化开发工作。 模板方法模式是一种行为设计模式,它定义了算法的骨架,并允许子类在不改变算法结构的情况下,对特定步骤进行重定义。在...
10.3 模板方法模式的应用 10.4 模板方法模式的扩展 10.5 最佳实践 第11章 建造者模式 11.1 变化是永恒的 11.2 建造者模式的定义 11.3 建造者模式的应用 11.4 建造者模式的扩展 11.5 最佳实践 第12章 代理模式 12.1 ...
- **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 - **策略模式**:定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。 - **命令模式**:将一个请求封装为一个对象,从而使...
《Java与模式》是闫宏大师的一部经典之作,它将古老的哲学智慧——道德经的智慧,巧妙地融入到现代编程语言Java的设计模式之中。这本书不仅深入浅出地讲解了23种经典的设计模式,还提供了丰富的实践案例,旨在帮助...
以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...
### Java设计模式(1)——理解与应用 #### 一、设计模式概述 设计模式是在软件工程领域中,为了应对特定问题或情境而形成的最佳实践集合。这些模式可以帮助开发者更高效地解决常见问题,提高代码的可重用性和可...
设计模式是解决软件设计中常见问题的模板,如单例模式、工厂模式、装饰器模式、观察者模式等。面试中会考察对设计模式的理解和应用,以评估候选人的设计思维和代码复用能力。 九、英文面试题 对于国际化的企业,...
**JAVA设计模式——核心概念与应用** 设计模式是软件开发中的宝贵经验总结,它们是针对常见问题的可重用解决方案。在Java编程中,设计模式是提升代码质量、可维护性和扩展性的关键。《JAVA设计模式.影印版》这本书...