【抽象工厂模式】以http调用为例子

@Slf4j
public abstract class AbstractThemeLinkInvoker<R, T>  {

    @Autowired
    ExceptionManager exceptionManager;

    @Autowired
    HttpInvokerTemplate httpInvoker;

    private static final Integer SUCCESS_CODE = 0;

    @HeraclesDynamicConfig(key = "theme.link.api.host", fileName = "thirdparty.properties", textType = TextType.NORMAL)
    private String themeLinkApiHost;

    @Tracing
    public ThemeLinkCommonResp<T> invoke(R request) {
        String url = themeLinkApiHost + getUrl();
        Map<String, String> params = JSONObject.parseObject(JSONObject.toJSONString(request), Map.class);
        ThemeLinkCommonResp<T> response = httpInvoker.requestFormByPost(url, params,
                new TypeReference<ThemeLinkCommonResp<T>>(getDataClass()) { });
        checkSuccess(response);
        return response;
    }

    private void checkSuccess(ThemeLinkCommonResp response) {
        if (Objects.nonNull(response) && SUCCESS_CODE.equals(response.getErrno())) {
            return;
        }
        throw exceptionManager.createException(ResponseCode.SYSTEM_ERROR, "操作失败,请稍后再试");
    }

    protected abstract String getUrl();

    protected abstract Class<T> getDataClass();
}

其中http调用的代码为

public <T> T requestFormByPost(String url, Map<String, String> request, TypeReference<T> typeReference) {
        Map<String, String> headers = Maps.newHashMap();
        headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        byte[] responseBytes = null;
        try {
            responseBytes = HttpConnectUtil
                    .getResponseByPost(HttpConnectManager.newHttpClient(connectionTimeout, readTimeout), url, headers,
                            request);
        } catch (HttpStatusCodeException e) {
            log.error("Req {} {} {} RespStatus {}, response = {}", url, headers, request, e.getHttpCode(),
                    responseBytes != null ? new String(responseBytes) : "", e);
            throw new RuntimeException("IllegalStatus " + e.getHttpCode());
        } catch (Exception e) {
            log.error("HttpReqError {} {} {}", url, headers, request, e);
            throw new RuntimeException(e);
        }
        String responseBodyString = new String(responseBytes);
        log.debug("responseBodyString={}" + responseBodyString);
        return JSON.parseObject(responseBodyString, typeReference);
    }

某个继承类

@Slf4j
@Component
public class ThemeLinkContentListInvoker extends
        AbstractThemeLinkInvoker<ThemeLinkContentListRequest, ThemeLinkContentListResponse> {

    @Override
    public String getUrl() {
        return "/xxxx";
    }

    @Override
    public Class<ThemeLinkContentListResponse> getDataClass() {
        return ThemeLinkContentListResponse.class;
    }
}

返回公共类

@Data
@ToString
public class ThemeLinkCommonResp<T> {
    private Integer errno;
    private T data;
}
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抽象工厂是一种创建对象的设计模式,它允许客户端代码通过接口或抽象类与具体工厂进行交互,而不是直接与具体产品进行交互。抽象工厂模式的目的是提供一个统一的接口,用于创建一组相关或相互依赖的对象。 在抽象工厂模式中,有两个关键的角色:抽象工厂和具体工厂。抽象工厂定义了一组方法,用于创建不同类型的产品。具体工厂实现了抽象工厂,并负责实际创建产品的过程。 抽象工厂模式的优点在于它能够将客户端代码与具体产品的实现解耦,使客户端代码更加灵活和可扩展。通过使用抽象工厂,客户端代码可以通过调用抽象工厂的方法来创建产品,而无需关心具体产品的实现细节。 举个例子,假设我们有一个汽车制造工厂,该工厂可以生产不同品牌的汽车(例如奥迪、宝马和奔驰)。我们可以定义一个抽象工厂接口(例如CarFactory),其中包含了创建不同品牌汽车的方法(例如createAudiCar()、createBMWCar()和createMercedesCar())。然后,我们可以有多个具体工厂(例如AudiFactory、BMWFactory和MercedesFactory),分别实现抽象工厂接口,并负责创建相应品牌的汽车。 通过使用抽象工厂模式,客户端代码可以通过调用CarFactory的方法来创建具体品牌的汽车,而无需关心具体工厂和产品的实现细节。这种方式可以使客户端代码更加灵活,因为它可以根据需要切换不同的具体工厂,从而创建不同品牌的汽车。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值