写给自己看的设计模式之《模板方法模式》

概念参考: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);
    }
}

猜你喜欢

转载自blog.csdn.net/Dkangel/article/details/105806966