介绍
在模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
简单来说,就是先定义了一个模板方法,这个模板方法通常是用final修饰的,防止修改,然后模板方法定义了其他方法的操作顺序,当我们使用这个模板方法时,可以改变内部的其他方法的执行内容,但是不能改变方法之间的执行流程。
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法
如何解决:将这些通用算法抽象出来
关键代码:在抽象类实现步骤流程,具体步骤在子类实现
优点:
- 封装不变部分,扩展可变部分
- 提取公共代码,便于维护。
- 行为由父类控制,子类实现
缺点:
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。
示例
创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被外界修改,Cricket 和 Football 是扩展了 Game 的实体类,它们重写了抽象类的方法。
1、创建模板方法
1 | public abstract class Game { |
2、创建实现类
实现类主要用于实现模板方法内部调用的方法
1 | public class Cricket extends Game { |
3、演示模板方法
1 | public class TemplatePatternDemo { |
可以看到,抽象类中的final模板方法调用了其他的几个抽象方法,
而实现抽象类的子类重写了这几个抽象方法,然后使用final模板方法调用这些抽象方法,实现了相同抽象方法,不同实现,相同模板。
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/21/designPattern/2020-03-21-templatePattern/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!