概念
模板方法模式 在意个方法中定义一个算法的骨架,而将这些具体步骤实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中
的某些步骤。
实现
- 类图:
AbstractProjectDesign:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27package com.littlehui.design.templatemethod;
/**
* @Description TODO
* @ClassName AbstractProjectDesign
* @Author littlehui
* @Date 2019/10/9 11:12
* @Version 1.0
**/
public abstract class AbstractProjectDesign {
public final void tempateMethod() {
//需求分析
demandAnalysis();
//架构设计
architecturalDesign();
//代码编写
coding();
}
protected abstract void demandAnalysis();
protected abstract void architecturalDesign();
protected abstract void coding();
}PaymentProjectDesign:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.littlehui.design.templatemethod;
/**
* @Description TODO
* @ClassName PaymentProjectDesign
* @Author littlehui
* @Date 2019/10/9 11:27
* @Version 1.0
**/
public class PaymentProjectDesign extends AbstractProjectDesign {
protected void demandAnalysis() {
System.out.println("支付项目需求分析");
}
protected void architecturalDesign() {
System.out.println("支付项目的架构设计");
}
protected void coding() {
System.out.println("支付项目的编码");
}
}SearchProjectDesign:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.littlehui.design.templatemethod;
/**
* @Description TODO
* @ClassName SearchProjectDesign
* @Author littlehui
* @Date 2019/10/9 11:32
* @Version 1.0
**/
public class SearchProjectDesign extends AbstractProjectDesign {
protected void demandAnalysis() {
System.out.println("搜索项目需求分析");
}
protected void architecturalDesign() {
System.out.println("搜索项目架构设计");
}
protected void coding() {
System.out.println("搜索项目编码");
}
}Client:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.littlehui.design.templatemethod;
/**
* @Description TODO
* @ClassName Client
* @Author littlehui
* @Date 2019/10/9 11:33
* @Version 1.0
**/
public class Client {
public static void main(String[] args) {
AbstractProjectDesign paymentProject = new PaymentProjectDesign();
AbstractProjectDesign searchProject = new SearchProjectDesign();
paymentProject.tempateMethod();
searchProject.tempateMethod();
}
}
执行:
1 | Connected to the target VM, address: '127.0.0.1:50695', transport: 'socket' |
抽象类里的tempateMethod执行的是具体的业务逻辑。以一个个抽象方法呈现。以上展示的逻辑是顺序执行逻辑。
此外还可以加上分支,利用模板钩子的方式实现分支逻辑。在具体实现类里面进行取舍。
场景
使用模板方法首先将不同业务场景分解成顺序执行的逻辑。将这些具体的逻辑抽出共性,组成抽象方法。如果有
具体的分支的话,利用钩子的方法进行扩展。
总结
模板方法重点在于定义模板类。
注意的点
1:模板类由 基本方法,模板方法,钩子方法构成。
2:基本方法用final修饰。表明不能修改的。其他的模板方法,钩子等用protected修饰,用于子类的集成修改。