Java实现适配器模式|策略模式

文章描述了一个系统需要接收来自不同渠道,格式各异的数据,并通过适配器模式将这些数据转换为系统期望的格式。定义了一个抽象适配器类,包含一个转换方法,子类根据具体数据类型实现该方法进行转换。文中提到的实现涉及到了泛型类和Spring组件注解,使得添加新数据源的适配变得简单。在处理请求时,通过适配器将外部数据转换为内部可处理的格式,然后进一步操作。
摘要由CSDN通过智能技术生成

有个需求,系统要接收外部不同渠道的流量,每个渠道的数据格式有所不同,需要将它们进行特定的处理以符合系统所定义的数据要求,实现这个需求考虑使用适配器模式

我们可以为每个数据源编写一个适配器类,数据转换成期望的格式再送入系统

这个有点像适配器模式,但感觉又不是适配器模式

Target:客户期望获得的功能接口(本地系统期待的数据类型)
Cilent:客户,期望访问Target接口(就是基于本地系统期待的数据类型进行操作)
Adaptee:现有接口,这个接口需要被适配(第三方数据)
Adapter:适配器类,适配现有接口使其符合客户需求接口(把第三方数据转换为本地系统期待的数据类型)

也就是说,当前系统只具备adaptee的功能,但是我期望的是target中的功能;所以我们使用adapter来继承当前adaptee的功能并且实现target的功能。

上面说到的适配器模式都是对于功能的应用,而我们的需求是:将外部数据处理成符合我们系统的数据格式;但本质上的思想是差不多的

所以适配器类就是继承Adaptee实现target接口,但是我们的需求比较特殊,是对数据进行转换,而不是方法转换;即定义一个父类适配器,有个抽象的数据转换方法,子类适配器实现该方法,将自身格式的数据转换为targetData

实现思路

定义一个适配器抽象类,用于转换数据

public abstract class Adapter<T extends BaseData> { // 这里其实不需要extends BaseData,这样的实现方式是为了要T限制在数据处理,而不是随便一个入参都行
    public abstract TargetData transform(T t);
}

方法入参是不同格式的外部数据,返回值是我们的目标数据;为了实现这个需求,我们使用了泛型类,T为BaseData的子类;这样定义也是很合理的,因为外部数据有所不同,但是他们还是有一些必须的共同参数;

然后每次接入新的数据源,我们就定义一个适配器,继承Adapter实现相应的transform方法就可以了

@Component
public class DouyinAdapter extends Adapter<DouyinData> { // 这里泛型指定为对应的数据类型
    @Override
    public TargetData transform(DouyinData douyinData) {
        // 相关数据转换操作
        return targetData;
    }
}

然后就可以啦,我们来看看调用

@RestController
public class DataController {
    @Autowired
    private DataService dataService;

    @Autowired
    private DouyinAdapter douyinAdapter;

    @PostMapping(value = "/douyin")
    public int handleData(@RequestBody DouyinData data) {
        TargetData targetData = douyinAdapter.transform(data); // 注意,从这个角度看很像是策略模式,但是策略模式的入参是一致的,而我这里要对不同类型的数据进行处理,不可能直接用父类BaseData,所以严格来看,我使用的是适配器模式和策略模式思想的组合
        dataService.handleMyData(targetData);
        return 1;
    }
}

是不是很简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值