设计模式-行为型模式-模版方法模式

概述

模板方法模式 :Template Method Pattern : 是一种行为型设计模式.
它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
符合 开闭原则。
可以在算法的流程中,添加一些钩子方法,供子类使用,方便对原算法进行扩展

角色

抽象类(Abstract Class)定义了算法的框架 ,即一系列步骤组成的操作,并且可以提供默认实现或者要求子类实现。
具体类(Concrete Class):实现了抽象类中定义的一些或所有步骤,但不改变算法的结构。

使用场景

复制代码
当你需要提供一个算法的不变部分,同时允许客户通过其子类来定制该算法的部分步骤时,可以使用模板方法模式。
例如,在开发框架中,模板方法可用于强制执行固定流程,同时让开发者自定义特定行为。

使用案例

情景介绍

软件开发中,有 CS 架构的开发、有BS 架构的开发。
开发流程都是一样的,对接需求、功能设计、编码开发、测试 等。

但是,具体的编码开发的过程是有区别的 :

1)例如 CS架构的开发可能主要以 C# 语言为主进行编码;

2)BS架构的开发可能主要以Java和HTML相关的前端框架为主进行编码。

以上述情景为背景,写一下案例。

类图

抽象类 SoftwareDev 中的 dev() 方法,就是一个模板方法,方法中定义好了整体的开发流程;

coding() 方法,是一个抽象方法,各个子类根据实际情况使用不同的开发语言实现编码。

案例代码

抽象类

java 复制代码
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实现子类

java 复制代码
public class SoftwareDevCS extends SoftwareDev{
    @Override
    public void coding() {
        System.out.println("CS 架构的软件编码。。。");
    }
}

BS实现子类

java 复制代码
public class SoftwareDevBS extends SoftwareDev{
    @Override
    public void coding() {
        System.out.println("BS 架构的软件编码。。。");
    }
}

使用测试

java 复制代码
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 架构的软件编码。。。
测试
相关推荐
阿维的博客日记26 分钟前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI26 分钟前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
辰海Coding2 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
小小编程路2 小时前
C++ 多线程与并发
java·jvm·c++
AI视觉网奇2 小时前
linux 检索库 判断库是否支持
java·linux·服务器
她的男孩2 小时前
从零搭一个企业后台,为什么我把能力拆成 Starter 和 Plugin
java·后端·架构
RainCity2 小时前
Java Swing 自定义组件库分享(七)
java·笔记·后端
Sam_Deep_Thinking3 小时前
连锁门店的外卖订单平台对接
java·微服务·架构·系统架构
_遥远的救世主_3 小时前
从一次结果集密集型查询 OOM 看 Java 服务的稳定性架构治理
java·后端
一楼的猫3 小时前
从工具链视角对比:番茄作家助手 vs 第三方写作辅助方案
java·服务器·开发语言·前端·学习·chatgpt·ai写作