1.模板方法模式
定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2.UML类图

模板方法模式包括两种角色:
● 抽象模板:抽象模板是一个抽象类。抽象模板定义了若干个方法以表示一个算法的各个步骤,这些方法中有抽象方法也有非抽象方法,其中的抽象方法称作原语操作。重要的一点是,抽象模板中还定义了一个称作模板方法的方法,该方法不仅包含有抽象模板中表示算法步骤的方法调用,而且也可以包含有定义在抽象模板中的其他对象的方法调用,即模板方法定义了算法骨架。
● 具体模板:具体模板是抽象模板的子类,实现抽象模板中的原语操作。
通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。

3.举例

//抽象模板
public abstract class AbstractTemplate {public abstract void primitiveOperation1();public abstract void primitiveOperation2();public void templateMethod() {primitiveOperation1();primitiveOperation2();System.out.println("调用了所有方法");}
}

具体模板

public class ConcreteTemplate1 extends AbstractTemplate {@Overridepublic void primitiveOperation1() {System.out.println("具体模板类1方法实现1");}@Overridepublic void primitiveOperation2() {System.out.println("具体模板类1方法实现2");}@Overridepublic void templateMethod() {super.templateMethod();}
}
public class ConcreteTemplate2 extends AbstractTemplate {@Overridepublic void primitiveOperation1() {System.out.println("具体模板类2方法实现1");}@Overridepublic void primitiveOperation2() {System.out.println("具体模板类2方法实现2");}@Overridepublic void templateMethod() {super.templateMethod();}
}

模式使用

public class TemplateTest {public static void main(String[] args) {AbstractTemplate template=new ConcreteTemplate1();template.templateMethod();template=new ConcreteTemplate2();template.templateMethod();}
}

4.钩子方法
模板方法既可以包含抽象方法的调用也可以包含具体方法的调用。具体模板必须重写抽象模板中的抽象方法,但是对于抽象模板中的具体方法,具体模板可以选择直接继承或重写这个具体方法。钩子方法是抽象模板中定义的具体方法,但给出了空实现或默认的实现,如果抽象模板不希望其中的具体方法是钩子方法,就需要将该具体方法用final修饰,要求子类必须继承该具体方法,不能重写。某些钩子方法的作用是对模板方法中的某些步骤进行挂钩,以确定在什么条件下执行模板方法中的哪些算法步骤。
5.适用场景
设计者需要给出一个算法的固定步骤,并将某些步骤的具体实现留给子类来实现
需要对代码进行重构,将各个子类公共行为提取出来集中到一个共同的父类中以避免代码重复
总结
模板方法模式优点:
在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序。
模板方法模式是一种代码复用技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为,它鼓励我们恰当使用继承来实现代码复用。
可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行。
在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则。
模板方法模式缺点:
需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象,此时,可结合桥接模式来进行设计。

参考:

http://blog.csdn.net/lmj623565791/article/details/26276093
http://blog.sina.com.cn/s/blog_7f311ef50102uxvv.html
http://blog.csdn.net/yanbober/article/details/45501715

设计模式——模板方法模式相关推荐

  1. 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式

        前段时间学习了一些设计模式,最近在做项目的过程中恰巧用到了其中的一个--模板方法模式.这个模式在程序设计过程中可是为小编省去了不少的代码量呢.具体是怎样应用的呢?接下来小编为您分享. 前面博文 ...

  2. 『设计模式』瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)

    23种设计模式+额外常用设计模式汇总 (持续更新) 简介 Define the skeleton of an algorithm in an operation,deferring some step ...

  3. 『设计模式』设计模式--模板方法模式

    23种设计模式+额外常用设计模式汇总 (持续更新) 简介 Define the skeleton of an algorithm in an operation,deferring some step ...

  4. 行为型设计模式---模板方法模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  5. Java设计模式-模板方法模式详解

    Java设计模式-模板方法模式 文章目录 Java设计模式-模板方法模式 0.前言 1.模板方法原理 2.模板方法模式中的角色 3.模板方法模式的UML类图 4.代码实现 5.编码测试 6.模板模式中 ...

  6. Java设计模式 - 模板方法模式

    Java设计模式 - 模板方法模式 定义一个算法的骨架,并将一些步骤通过子类表达. UML图示 要点 1. 定义一个算法的骨架 - 建立一个抽象类 2. 将一些步骤通过子类表达 - 子类继承抽象类 赋 ...

  7. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  8. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  9. 模板设计模式_设计模式-模板方法模式

    一.模板方法模式的定义 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计 ...

  10. 大话设计模式—模板方法模式

    在模板方法模式(TemplateMethod Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于 ...

最新文章

  1. window.print()前端实现打印功能
  2. python flask实现博客系统_基于Flask的博客网站设计与实现
  3. 安卓 激活应用组件 intent
  4. 最新OpenSSL漏洞CCS注入及升级修复
  5. html 的c标签库,jstl C标准标签库Ⅰ
  6. MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN
  7. axure 鼠标变成手,Axure教程|鼠标移入移出自动显示与隐藏三级菜单
  8. java 控制语句_java两个控制语句(转)
  9. Docker的C/S模式
  10. hihoCoder - 1075 开锁魔法III
  11. 顶级SaaS公司的共同基因都有什么?
  12. python如何检验显著性差异_Python中如何计算Pearson相关性和显著性?
  13. 【19调剂】华南师范大学脑科学与康复医学研究院2019年拟接收学术型研究生调剂信息...
  14. 计算机网络的期刊,科学网—晒个自己整理的计算机网络和通信方向可能相关的期刊列表 - 张国强的博文...
  15. rem、em、px、rpx、vw、vh、%等
  16. 云计算平台建设总体技术方案
  17. Excel中使用正则表达式的方法
  18. dump在计算机中的意义
  19. 实例演示R语言制作限制性立方条图
  20. 使用JMeter进行MQTT压力测试

热门文章

  1. carmaker的弱智算法
  2. Eclipse配置Hadoop开发环境
  3. Java程序性能优化(让你的Java程序更快、更稳定)
  4. ASP.NET 订餐系统-程序+配置文档
  5. 课程设计(运动会管理系统)
  6. Think PHP(TP)框架基础知识
  7. 《浪潮之巅》笔记之七
  8. java从0单排之java就业培训教程复习与面试题回顾——02
  9. 点石成金:访客至上的网页设计秘笈pdf
  10. 最全解读Unicode字符编码