模版方法实践案例
实践之前还是先了解一下模版方法的定义
定义
模板方法模式是一种行为设计模式,它定义了一个骨架,并允许子类在不改变结构的情况下重写的特定步骤。模板方法模式通过在父类中定义一个模板方法,其中包含了主要步骤,而将一些步骤的实现留给子类。这样,子类可以在不改变算法整体结构的情况下,根据需要重新实现某些步骤。
在什么情况下要使用模版方法呢?设计模式不能生搬硬套,而是在一些适合的场景下进行使用,否则会适得其反,可以看看这篇文章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
)
分析一下
好处在哪?
- 提高代码一致性
如果我的系统中仅有ChatAIRequest这个类,那我大可不必采用模版方法
问题是我的项目中有大量的Request类,并且这个Request的骨架是相同的,所以这些Request类只需要继承BaseRequest这个抽象类,实现各自的获取请求方法(getMethod
)、获取路径(getPath
)、获取响应类(getResponseClass
)即可
-
减少重复代码: 具体的请求类(例如
chatAiRequest
)无需重复实现算法的整体结构,只需专注于实现特定的步骤,如获取请求方法、路径等。这降低了代码的冗余,符合"Don’t Repeat Yourself"(DRY)原则 -
提高代码的可维护性: 算法的整体结构集中在
BaseRequest
类中,使得代码更易理解和维护。如果有新的请求类需要添加,只需创建新的具体子类,并实现特定的步骤,而不需要修改已有的代码