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

概念参考: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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值