设计模式之模板方法

模板方法(template Method)

定义

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
(定义一个操作中的算法的框架, 而将一些步骤延迟到子类中。 使得子类可以不改 变一个算法的结构即可重定义该算法的某些特定步骤。)

说明

模板方法又名钩子函数,使用方法是定义一个算法骨架,并且将其中的一些步骤延迟到子类中。模板方法可以在不改变一些类算法步骤的情况下,重定义一些算法的具体步骤。
模板方法实现了一种反向控制,官方也称为“好莱坞原则”即“不要来找我们,我们会找你”,这里要注意反向控制和依赖倒置原则是完全不同的。反向控制是针对于类的继承特点来说的,子类继承父类,子类可以调用父类的方法,那么父类可不可以调用子类的方法那?答案是不可以(不包括静态方法),在程序中子类可以知道父类,但是父类是无法知道子类的(是不是感觉有点渣男的气息),这也导致父类无法了解子类中的扩展方法,即使通过强转也不行。
好莱坞选演员的原则是“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”,好莱坞是一个让众多靓男靓女欲罢不能的地方,全世界的演员哪个不想进。但是好莱坞不是大车店什么跳梁小丑想来就来,事实是如果你想进好莱坞那你先将简历投给他们,他们根据不同的演出选择不同的演员,这就是好莱坞选演员的方式。首先你把自己推荐过去(在好莱坞挂上名),好莱坞的大拿们设计剧情规则(需要一个二傻子),正好某个演员实现了规则,那好莱坞就给该演员打电话了。
模板方法是对继承模式的拓展,也是对接口完善,它弥补了接口开发中无法插入实现代码的缺点也完善了继承中无法实现双向调用的问题。
在模板方法中有三类函数一类是具体实现方法也叫模板方法,它规定了算法的总体框架,并约定了执行顺序,这也是模板的来源,该方法提供给客户端调用,所以类型一般为开放类型,子类一般不需要重写该方法;另一类是抽象方法,它需要继承的子类提供具体的实现,这些方法的调用规则已经在模板方法中规范好,由于这部分方法只对子类开放所以可将类型定义为保护类型;还有一类方法在父类中已经默认好了实现,子类可以重写也可以不重写这类方法,这种方法被命名为钩子方法。其实抽象方法也可以用带有默认实现的方法代替,因此抽象方法可以认为是钩子方法,这类方法依然是被模板方法调用所以类型一般为保护类型。

模板方法类图:
请添加图片描述

模板模式是一种行为上的反向调用,而依赖倒置体现在对象依赖关系上的反转,他们的最终目的都是解耦。

模板方法结构

模板方法中的角色:
AbstractClass 抽象类
定以一个算法的基本框架,并定义对象的原语操作,具体的子类重定义这些原语操作并实现它们。
ConcreteClassA 具体实现类
实现原语操作,并完善算法中特定子类相关的步骤。
说明 原语操作指抽象方法

模板方法的优势
  1. 对固定框架的封装,对可变部分扩展,复合板OCP原则,当添加新的算法时只需要添加相应的子类,而对以往功能不会产生任何影响。
  2. 提取公共部分,减少代码的重复,进而减轻代码体积,从而使系统更便于理解和维护。
模板方法使用场景
  • 无法一次性实现一个算法时,可以将算法的不变部分与可变部分分离出来,把可变部分的实现延迟到子类中。
  • 当子类中存在大量重复代码时,可以将重复代码提取出来,集中到一个公共类中,从而避免代码重复。
  • 对于重要复杂的算法,可以将核心算法设计为模板方法,周边的细枝末节在子类中实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值