一. 什么是模板方法设计模式
从字面意义上理解, 模板方法就是定义出来一套方法, 作为模板, 也就是基础。 在这个基础上, 我们可以进行加工,实现个性化的实现。比如:一日餐三. 早餐, 中餐, 晚餐. 每个人都要吃三餐, 但每个人的三餐吃的可能都不一样. 一日三餐定义了模板–早中晚, 每个人的三餐就是模板的具体实现.
1.1 模板方法的用途
将不变的行为从子类搬到超类,去除了子类中的重复代码。规范子类的结构
1.2 模板方法的定义
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
二. 定义模板方法的步骤
第一步: 定义模板类
第二步: 定义具体子类
第三步: 客户端调用
下面来了解每一个步骤:
2.1 定义模板类
通常模板类是抽象类,负责给出算法的轮廓或者框架。他是有若干个模板方法和若干个基本方法构成。
模板方法
定义了算法的骨架, 定义了方法调用的顺序, 其中包含一个或者多个基本方法
基本方法
基本算法有三种类型:
a) 抽象方法:子类必须重写的方法。没有默认实现。
b)具体方法:父类定义的默认实现,有实现逻辑,可以被具体的子类继承或重写
c)钩子方法:判断的逻辑方法和需要子类重写的空方法两种。
2.2 定义具体子类
具体子类,也就是具体的实现类, 实现抽象类中的抽象方法。他们是抽象的模板方法中一个组成部分。
2.3 定义客户端调用
客户端调用抽象类, 实例化的时候实例化具体类, 只需要调用抽象类的模板方法就可以了。
2.4 下面来看一下抽象类和子类之间的UML图和源码实现
1.UML图
从图中可以看出抽象类的结构可以定义三类方法。 可以有一个也可以有多个。子类必须需要实现抽象类中的抽象方法,可以选择性重写父类的具体方法。子类实现接口的时候,要多思考设计模式的六大原则。
2.源码
先定义抽象类, 也就是框架。
package com.lxl.www.designPatterns.templatePattern.template; /** * 抽象类, 定义模板 */ public abstract class AbstractClass { /** * 定义模板方法 * 规范了流程的框架 */ public void templateMethod() { // 先调用具体方法 specificMethod(); // 在调用抽象方法 abstractMethod(); } /** * 具体方法 */ public void specificMethod() { // 具体的公共逻辑, 父子类通用 System.out.println("具体方法---父子类通用逻辑"); } /** * 抽象方法 * * 抽象方法, 子类必须重写 */ public abstract void abstractMethod()<mark>本文来源gaodaimacom搞#^代%!码&网(</mark>; }
在定义具体的实现类, 实现父类的抽象方法
package com.lxl.www.designPatterns.templatePattern.template; /** * 具体实现类 */ public class ConcreteClass extends AbstractClass{ /** * 重写父类的抽象方法 */ @Override public void abstractMethod() { System.out.println("具体实现类--重写父类的抽象方法"); } }
最后定义客户端调用
package com.lxl.www.designPatterns.templatePattern.template; /** * 模板方法客户端 */ public class TemplateClient { public static void main(String[] args) { AbstractClass abstractClass = new ConcreteClass(); abstractClass.templateMethod(); } }