为了账号安全,请及时绑定邮箱和手机立即绑定

设计模式之合成(Composite)模式

标签:
Spark

场景:
数据流向:kafka-->spark-->es。
其中spark数据处理会有过滤,etl等步骤,需求不同,搭配不同。如A场景需要过滤+etl;B场景需要过滤+Etl1+etl2;C场景需要etl2+etl3。不同的合成有不同的功能。

实现:使用合成模式。
定义:
接口ChildProcess,作为合成子项的统一接口:

public interface ChildProcess {    public Dataset doChildProcess() throws Exception;
}

组合类:

public class CompositeChildProcess implements ChildProcess,Serializable {    private List<ChildProcess> childProcesses = new ArrayList<>();    public void add(ChildProcess childProcess) {
        childProcesses.add(childProcess);
    }    public void remove(ChildProcess childProcess) {
        childProcesses.remove(childProcess);
    }    @Override
    public Dataset doChildProcess(Dataset dataset) throws Exception{        for (ChildProcess childProcess : childProcesses) {
            dataset = childProcess.doChildProcess(dataset);
        }        return dataset;
    }
}

elt合成子项:

public class CustomEtlProcess implements ChildProcess {    @Override
    public Dataset doChildProcess(Dataset dataset) throws Exception{
       ....        return etl;
    }
}

filter合成子项:

public class CustomkafkaFilterProcess implements ChildProcess,Serializable {  @Override
    public Dataset doChildProcess(Dataset dataset) throws Exception{
      ....        return filter;
    }
}

client调用端:
如kafka-filter-etl-es过程

CompositeChildProcess compositeChildProcess = new CompositeChildProcess();
CustomkafkaFilterProcess customkafkaFilterProcess = new CustomkafkaFilterProcess();
compositeChildProcess.add(customkafkaFilterProcess);
CustomEtlProcess customEtlProcess = new CustomEtlProcess();
compositeChildProcess.add(customEtlProcess);
compositeChildProcess.doChildProcess();

如kafka-etl-filter-etl-es过程:

CompositeChildProcess compositeChildProcess = new CompositeChildProcess();
CustomEtlProcess customEtlProcess = new CustomEtlProcess();
compositeChildProcess.add(customEtlProcess);
CustomkafkaFilterProcess customkafkaFilterProcess = new CustomkafkaFilterProcess();
compositeChildProcess.add(customkafkaFilterProcess);
CustomEtlProcess customEtlProcess = new CustomEtlProcess();
compositeChildProcess.add(customEtlProcess);
compositeChildProcess.doChildProcess();

由于所以子项,包含组合类都实现了子项接口,因此可有任意组合和多层级组合,实现灵活多变的流程控制。



作者:假文艺的真码农
链接:https://www.jianshu.com/p/b6b77a353fb5


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消