概述
模板方法模式
:Template Method Pattern : 是一种行为型设计模式
.
它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
符合 开闭原则。
可以在算法的流程中,添加一些
钩子方法
,供子类使用,方便对原算法进行扩展。
角色
抽象类(Abstract Class)
:定义了算法的框架,即一系列步骤组成的操作,并且可以提供默认实现或者要求子类实现。
具体类(Concrete Class)
:实现了抽象类中定义的一些或所有步骤,但不改变算法的结构。
使用场景
当你需要提供一个算法的不变部分,同时允许客户通过其子类来定制该算法的部分步骤时,可以使用模板方法模式。
例如,在开发框架中,模板方法可用于强制执行固定流程,同时让开发者自定义特定行为。
使用案例
情景介绍
软件开发中,有 CS 架构的开发、有BS 架构的开发。
开发流程都是一样的,对接需求、功能设计、编码开发、测试 等。
但是,具体的编码开发的过程是有区别的
:
1)例如 CS架构的开发可能主要以 C# 语言为主进行编码;
2)BS架构的开发可能主要以Java和HTML相关的前端框架为主进行编码。
以上述情景为背景,写一下案例。
类图
抽象类 SoftwareDev 中的 dev() 方法,就是一个模板方法,方法中定义好了整体的开发流程;
coding() 方法,是一个抽象方法,各个子类根据实际情况使用不同的开发语言实现编码。
案例代码
抽象类
public abstract class SoftwareDev {
/**
* 模板方法,固定了代码的流程
*/
public void dev(){
requirementAnalysise();
functioinDesign();
coding();
test();
}
public void requirementAnalysise(){
System.out.println("需求分析");
}
public void functioinDesign(){
System.out.println("功能设计");
}
/**
* 抽象方法,子类必须实现
*/
public abstract void coding();
public void test(){
System.out.println("测试");
}
}
CS实现子类
public class SoftwareDevCS extends SoftwareDev{
@Override
public void coding() {
System.out.println("CS 架构的软件编码。。。");
}
}
BS实现子类
public class SoftwareDevBS extends SoftwareDev{
@Override
public void coding() {
System.out.println("BS 架构的软件编码。。。");
}
}
使用测试
public class TemplatePatternTest {
public static void main(String[] args) {
// 测试CS开发
SoftwareDev csdev = new SoftwareDevCS();
csdev.dev();
System.out.println("========");
// 测试BS开发
SoftwareDev bsdev = new SoftwareDevBS();
bsdev.dev();
}
}
运行结果: 功能的执行流程一致,但是 核心的 coding 方法由子类确定。
需求分析
功能设计
CS 架构的软件编码。。。
测试
========
需求分析
功能设计
BS 架构的软件编码。。。
测试