专业的JAVA编程教程与资源

网站首页 > java教程 正文

适配器模式实例

temp10 2024-11-26 08:59:36 java教程 15 ℃ 0 评论

请点击【关注】获取更多互联网和技术干货,头条号IT徐胖子原创本文请勿转载,感谢支持

1 适配器模式概述

现在有这样一个场景:你们系统调用了订单中心的服务OrderService,但是订单中心改造新增了OrderNewService,订单中心要求你们都改用OrderNewService接口,现在由你主导接口切换工作。

适配器模式实例

切换接口尤其是核心接口风险还是比较大的,我们希望改动尽量少,减少对原有业务代码侵入性。这种情况我建议使用适配器模式。我们来分析这个实例。

2 原始调用方式

2.1 老订单服务

/**
 * 外部订单服务
 *
 * @author 今日头条号「IT徐胖子」
 *
 */
public interface OrderService {

    /**
     * 创建订单
     *
     * @param goodsId 商品ID
     * @param price   商品价格
     * @return 订单编号
     */
    public String createOrder(String goodsId, Long price);
}

/**
 * 外部订单服务实现
 *
 * @author 今日头条号「IT徐胖子」
 *
 */
public class OrderServiceImpl implements OrderService {

    @Override
    public String createOrder(String goodsId, Long price) {
        String orderId = "orderId_111";
        System.out.println("创建订单成功[goodsId=" + goodsId + ",price=" + price + "]");
        return orderId;
    }
}

2.2 调用老订单服务

/**
 * 模拟本系统调用
 *
 * @author 今日头条号「IT徐胖子」
 *
 */
public class TestDemo {
    public static void main(String[] args) {
        OrderService service = new OrderServiceImpl();
        service.createOrder("goodsId_123", 100 L);
    }
}

3 使用适配器模式

3.1 新订单模型

/**
 * 新订单模型
 *
 * @author 今日头条号「IT徐胖子」
 *
 */
public class OrderNewModel {
    private String goodsId;
    private Long price;

    public String getGoodsId() {
        return goodsId;
    }

    public void setGoodsId(String goodsId) {
        this.goodsId = goodsId;
    }

    public Long getPrice() {
        return price;
    }

    public void setPrice(Long price) {
        this.price = price;
    }
}

3.2 新订单服务

/**
 * 外部订单新服务
 *
 * @author 今日头条号「IT徐胖子」
 *
 */
public interface OrderNewService {

    /**
     * 创建订单
     *
     * @param orderModel 订单模型
     * @return 订单编号
     */
    public String createOrder(OrderNewModel orderModel);
}

/**
 * 外部订单新服务实现
 *
 * @author 今日头条号「IT徐胖子」
 *
 */
public class OrderNewServiceImpl implements OrderNewService {

    @Override
    public String createOrder(OrderNewModel orderModel) {
        String orderId = "orderId_222";
        System.out.println("新接口创建订单成功[goodsId=" + orderModel.getGoodsId() + ",price=" + orderModel.getPrice() + "]");
        return orderId;
    }
}

3.3 订单服务适配器

/**
 * 订单服务适配器
 *
 * @author 今日头条号「IT徐胖子」
 *
 */
public class OrderServiceAdaptor implements OrderService {
    private OrderNewService orderNewService;

    public OrderServiceAdaptor(OrderNewService orderNewService) {
        this.orderNewService = orderNewService;
    }

    @Override
    public String createOrder(String goodsId, Long price) {
        OrderNewModel orderModel = new OrderNewModel();
        orderModel.setGoodsId(goodsId);
        orderModel.setPrice(price);
        return orderNewService.createOrder(orderModel);
    }
}

3.4 替换为新服务

/**
 * 模拟本系统调用
 *
 * @author 今日头条号「IT徐胖子」
 *
 */
public class TestDemo {

    public static void main(String[] args) {
        OrderService service = new OrderServiceAdaptor(new OrderNewServiceImpl());
        serviceNew.createOrder("goodsId_222", 222 L);
    }
}

4 思考总结

我们看到将旧服务替换为新服务,在业务代码层面(TestDemo)并没有做大量修改,而是利用适配器模式,将新服务组合进适配器,对业务侵入性很低。

适配器模式顾名思义就是用来做适配的,适配器就像一个中转站,可以把原来不符合要求的数据、服务、接口转换为符合要求,从而可以一起工作。

工作中常用的场景是在新老服务切换时,适配器可以减少对业务代码的侵入性,符合对扩展开放,对修改关闭设计原则。

请点击【关注】获取更多互联网和技术干货,头条号IT徐胖子原创本文请勿转载,感谢支持

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表