一、什么情况下考虑使用“模板方法模式”?
当我们设计一个算法时,如果已经确定了算法的关键步骤和执行顺序,只是算法步骤的具体实现需要根据不同的情况,具体分配,此时我们可以考虑使用“模板方法模式”。
模板方法模式的概念:
在一个方法中定义个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
其中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设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...
10.3 模板方法模式的应用 10.4 模板方法模式的扩展 10.5 最佳实践 第11章 建造者模式 11.1 变化是永恒的 11.2 建造者模式的定义 11.3 建造者模式的应用 11.4 建造者模式的扩展 11.5 最佳实践 第12章 代理模式 12.1 ...
5.10TemplateMethodPattern(模板方法模式) 272 5.10.1定义 272 5.10.2现实例子——厨师烹调 274 5.10.3C#实例——数据库连接模板 274 5.10.4Java实例——冒泡排序模板 277 5.10.5优势和缺陷 280 5.10.6应用...
5.10TemplateMethodPattern(模板方法模式) 272 5.10.1定义 272 5.10.2现实例子——厨师烹调 274 5.10.3C#实例——数据库连接模板 274 5.10.4Java实例——冒泡排序模板 277 5.10.5优势和缺陷 280 5.10.6应用...
pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...
算法的封装与切换——策略模式(四) 模板方法模式-Template Method Pattern 模板方法模式深度解析(一) 模板方法模式深度解析(二) 模板方法模式深度解析(三) 访问者模式-Visitor Pattern 操作复杂对象结构——...
pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...
pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5...
pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5...
pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 二、设计...
pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...
pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...
pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...
pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5...
pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5...
模块四热点问题解答26讲单例模式:如何创建单一对象优化系统性能27讲原型模式与享元模式:提升系统性能的利器32讲MySQL调优之SQL语句:如何写出高性能SQL语句33讲MySQL调优之事务:高并发场景下的数据库事务调优34讲...
模板方法模式 访问者模式 设计案例 UML 架构 系统架构能力 基本理论 扩展性设计 可用性设计 可靠性设计 一致性设计 负载均衡设计 过载保护设计 协议设计 二进制协议 文本协议 接入层架构设计 DNS...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...