定义
模板方法模式 : 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
Template Method Pattern :Define the skeleton of an algorithm in a operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
优缺点
优点:
- 封装不变部分,扩展可变部分
- 提取公共部分代码,便于维护
- 行为由父类控制,子类实现
缺点:
按照一般设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行结构影响父类结果,也就是子类对父类产生了影响,增加代码阅读的难度
使用场景
- 多个子类有公有方法,并且逻辑基本相同
- 重要复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由各个子类实现
- 重构时,把相同的代码抽取到父类中,通过钩子函数约束其行为
实现方法
将父类定义为抽象类,叫做抽象模板,在其中定义方法,方法分为2种:
基本方法:由子类实现,并在模板方法中被调用
模板方法:一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑
具体实现
抽象模板
public abstract class HummerModel { //基本方法 protected abstract void start(); protected abstract void stop(); protected abstract void alarm(); protected abstract void engineBoom(); //模板方法,一般都加上final关键字,不允许覆写,防止恶意操作 final public void run() { this.start(); this.engineBoom(); if (this.isAlarm()) { this.alarm(); } this.stop(); } //钩子方法 protected boolean isAlarm() { return true; } }
子类1 : 覆写父类的钩子方法,反向控制父类运行结果
public class HummerH1Model extends HummerModel { boolean alarmFlag = true; @Override protected void start() { System.out.println("H1 start!"); } @Override protected void stop() { System.out.println("H1 stop!"); } @Override protected void alarm() { System.out.println("H1 alarm!"); } @Override protected void engineBoom() { System.out.println("H1 engineBoom!"); } @Override protected boolean isAlarm() { return this.alarmFlag; } public void setAlarm(boolean isAlarm) { this.alarmFlag = isAlarm; } }
子类2:覆写父类钩子方法,指定父类运行结果
public class HummerH2Model extends HummerModel { @Override protected void start() { System.out.println("H2 start!"); } @Override protected void stop() { System.out.println("H2 stop!"); } @Override protected void alarm() { System.out.println("H2 alarm!"); } @Override protected void engineBoom() { System.out.println("H2 engineBoom!"); } @Override protected boolean isAlarm() { return false; } }
子类3:不覆写钩子方法,保持父类的运行结果
public class HummerH3Model extends HummerModel { @Override protected void start() { System.out.println("H3 start!"); } @Override protected void stop() { System.out.println("H3 stop!"); } @Override protected void alarm() { System.out.println("H3 alarm!"); } @Override protected void engineBoom() { System.out.println("H3 engineBoom!"); } }
场景类
public class CLient { public static void main(String[] args) { HummerH1Model h1 = new HummerH1Model(); // h1.setAlarm(true); h1.setAlarm(false); h1.run(); HummerH2Model h2 = new HummerH2Model(); h2.run(); HummerH3Model h3 = new HummerH3Model(); h3.run(); } }
参考内容:
《设计模式之禅》秦小波
相关推荐
java的23种常用设计模式:模板方法模式
设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从一开始就采用的设计方案。它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用的软件而长时间进行的...
设计模式的模板方法模式的例子,希望对大家有用~~~~~~~~
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象...4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
设计模式--模板方法模式java例子
设计模式:简单工厂、方法工厂、抽象工厂、单例、原型、委派、模板、代理、策略
针对几种经典软件设计模式:模板方法模式 外观模式 代理模式 装饰器模式 桥模式 工厂方法模式 组合模式等给出了简单易懂的讲解,透彻明了。很好的学习资料哦,是我平时学习时做的笔记外加自己的理解,很不错的……
Head First 设计模式 (八) 模板方法模式(Template Method pattern) C++实现
设计模式-模板方法模式(讲解及其实现代码)
适合20分钟左右讲解的模板方法模式。 自己上课用的。
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 模板方法模式 java ...
logo 14模板方法模式:抽象类定义final方法模板方法模式:抽象类定义final方法 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第15页。 logo 15观察者模式:观察者接口和类、主题接口...
设计模式之模板方法模式Java实现和UML类设计图
Java设计模式之模板方法模式.rarJava设计模式之模板方法模式.rar
java设计模式的精简版,创建型模式:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式共五种; 结构型模式:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式共七种。 行为型...
本文实例讲述了Android编程设计模式之模板方法模式。分享给大家供大家参考,具体如下: 一、介绍 在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,...
将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载。