概念参考:https://blog.csdn.net/carson_ho/article/details/54910518
定义一个模板结构,基于继承关系将具体内容延迟到子类去实现
场景
- 子类中公共的行为应被提取并集中到公共父类中,并按需扩展特别的方法,避免代码重复
优点
提高代码复用性
子类通用的方法可以抽成基类方法提高了拓展性
子类可以根据自己的特点动态实现方法反向控制
通过父类调用其子类的操作,实现了反向控制符合“开闭原则”
缺点
- 引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度
使用
发送Get/Delete请求
1. 创建抽象父类
/**
* 抽象父类
*
* @author dkangel
*/
public abstract class RequestHandler {
private static final String PROTOCOL = "https://";
private static final int SUCCESS = 200;
/**
* 生成url
*
* @param host 主机名
* @param port 端口
* @param path 路径
* @return url
*/
public String generateUrl(String host, String port, String path) {
StringBuilder url = new StringBuilder(PROTOCOL);
url.append(host).append(":").append(port).append("/").append(path);
return url.toString();
}
/**
* 发送请求,由子类实现
*
* @param url url
* @return Response
*/
public abstract Response sendRequest(String url);
/**
* 处理返回结果
*
* @param response 返回体
*/
public void handleResponse(Response response) {
if (SUCCESS == response.getHttpCode()) {
System.out.println("handle success.");
}
}
/**
* 发送请求方法
*
* @param host 主机
* @param port 端口
* @param path path
*/
public void handleRequest(String host, String port, String path) {
String url = generateUrl(host, port, path);
Response res = sendRequest(url);
handleResponse(res);
}
}
2. 实现Get/Delete子类
/**
* Get请求
*
* @author dkangel
*/
public class GetRequestHandler extends RequestHandler {
@Override
public Response sendRequest(String url) {
System.out.println("send get request.");
Response response = new Response();
response.setHttpCode(200);
return response;
}
}
/**
* Delete请求
*
* @author dkangel
*/
public class DeleteRequestHandler extends RequestHandler {
@Override
public Response sendRequest(String url) {
System.out.println("send get request.");
Response response = new Response();
response.setHttpCode(200);
return response;
}
}
3. 使用
/**
* 模板方法模式使用类
*
* @author dkangel
*/
public class Main {
public static void main(String[] args) {
String host = "localhost";
String port = "8080";
String getPath = "/app/all";
get(host, port, getPath);
String deletePath = "/app/123";
delete(host, port, deletePath);
}
/**
* 发送Get请求
*
* @param host 主机名
* @param port 端口
* @param getPath path
*/
private static void get(String host, String port, String getPath) {
RequestHandler handler = new GetRequestHandler();
handler.handleRequest(host, port, getPath);
}
/**
* 发送Delete请求
*
* @param host 主机名
* @param port 端口
* @param deletePath path
*/
private static void delete(String host, String port, String deletePath) {
RequestHandler handler = new DeleteRequestHandler();
handler.handleRequest(host, port, deletePath);
}
}