设计模式之模版方法实践

模版方法实践案例

实践之前还是先了解一下模版方法的定义

定义

模板方法模式是一种行为设计模式,它定义了一个骨架,并允许子类在不改变结构的情况下重写的特定步骤。模板方法模式通过在父类中定义一个模板方法,其中包含了主要步骤,而将一些步骤的实现留给子类。这样,子类可以在不改变算法整体结构的情况下,根据需要重新实现某些步骤。

在什么情况下要使用模版方法呢?设计模式不能生搬硬套,而是在一些适合的场景下进行使用,否则会适得其反,可以看看这篇文章http://www.ayqy.net/blog/设计模式总结(《head-first设计模式》学习总结)

进入正题

以下是我项目应用模版方法的代码片段

/**
 * @Author: HWQ
 * @Version: 1.0
 * @Description: 基本api请求
 */
public abstract class BaseRequest<O, T extends ResultResponse> {
    private Map<String, Object> requestParams = new HashMap<>();

    /**
     * get方法
     *
     * @return {@link}
     */
    public abstract String getMethod();

    /**
     * 获取路径
     *
     * @return {@link String}
     */
    public abstract String getPath();

    /**
     * 获取响应类
     *
     * @return {@link Class}<{@link T}>
     */
    public abstract Class<T> getResponseClass();

    @JsonAnyGetter
    public Map<String, Object> getRequestParams() {
        return requestParams;
    }

    public void setRequestParams(O params) {
        // 将JSON对象转为Map
        this.requestParams = new Gson().fromJson(JSONUtil.toJsonStr(params), new TypeToken<Map<String, Object>>() {
        }.getType());
    }
}

BaseRequest定义了骨架,具体的步骤包括获取请求方法(getMethod)、获取路径(getPath)、获取响应类(getResponseClass)等。

/**
 * @author HWQ
 * @date 2024/2/28 11:54
 * @description
 */

@Accessors(chain = true)
public class ChatAIRequest extends BaseRequest<ChatAIParams, ResultResponse> {

    @Override
    public String getPath() {
        return "/chatAi";
    }

    /**
     * 获取响应类
     *
     * @return {@link Class}<{@link NameResponse}>
     */
    @Override
    public Class<ResultResponse> getResponseClass() {
        return ResultResponse.class;
    }


    @Override
    public String getMethod() {
        return RequestMethodEnum.GET.getValue();
    }
}

ChatAIRequest继承了BaseRequest这个抽象类,实现了获取请求方法(getMethod)、获取路径(getPath)、获取响应类(getResponseClass)

分析一下

好处在哪?

  1. 提高代码一致性

如果我的系统中仅有ChatAIRequest这个类,那我大可不必采用模版方法

问题是我的项目中有大量的Request类,并且这个Request的骨架是相同的,所以这些Request类只需要继承BaseRequest这个抽象类,实现各自的获取请求方法(getMethod)、获取路径(getPath)、获取响应类(getResponseClass)即可

在这里插入图片描述

  1. 减少重复代码: 具体的请求类(例如 chatAiRequest)无需重复实现算法的整体结构,只需专注于实现特定的步骤,如获取请求方法、路径等。这降低了代码的冗余,符合"Don’t Repeat Yourself"(DRY)原则

  2. 提高代码的可维护性: 算法的整体结构集中在 BaseRequest 类中,使得代码更易理解和维护。如果有新的请求类需要添加,只需创建新的具体子类,并实现特定的步骤,而不需要修改已有的代码

相关推荐

  1. 【前端设计模式模版方法模式

    2024-03-10 20:36:08       39 阅读
  2. Spring设计模式-实战模板方法模式

    2024-03-10 20:36:08       19 阅读
  3. 设计模式模板方法

    2024-03-10 20:36:08       35 阅读
  4. 设计模式模板方法

    2024-03-10 20:36:08       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 20:36:08       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 20:36:08       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 20:36:08       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 20:36:08       18 阅读

热门阅读

  1. leetcode 2834.找出美丽数组的最小和

    2024-03-10 20:36:08       18 阅读
  2. MySQL的页与行格式

    2024-03-10 20:36:08       27 阅读
  3. DPN网络

    DPN网络

    2024-03-10 20:36:08      21 阅读
  4. 银行app软件使用技巧,避免被限制非柜面交易。

    2024-03-10 20:36:08       55 阅读
  5. 初识C语言—字符串、转义字符、注释

    2024-03-10 20:36:08       22 阅读
  6. vue3注册全局组件

    2024-03-10 20:36:08       18 阅读
  7. Docker Register 搭建私有镜像仓库

    2024-03-10 20:36:08       20 阅读
  8. Linux 系统上卸载 Docker

    2024-03-10 20:36:08       21 阅读
  9. 在 Docker 环境下安装 OpenWrt

    2024-03-10 20:36:08       25 阅读
  10. Docker修改网段

    2024-03-10 20:36:08       22 阅读
  11. Kotlin 中的数据类

    2024-03-10 20:36:08       21 阅读