zoukankan      html  css  js  c++  java
  • 管道模式

    挺不错的一个设计模式,先记下来以便以后哪里可以用到:

    接口:数据处理管道的阀门(处理器):

    对应实现类:

    接口:数据处理管道:

     对应实现类:

    代码:

    public class DataPipelineImpl implements DataPipeline{

      private List<DataValve> valveList = Lists.newArrayList();   //存放管道的阀门
      private Object firstInputData; 
      private Object lastOutputData;

      @Override
      public void init() {
        valveList.clear();
        firstInputData =null;
        lastOutputData =null;
      }

      @Override
      public void addValve(DataValve valve) {   //添加阀门
        if(valve!=null){
          valveList.add(valve);    
        }
      }

      @Override
      public void execute() {
        if(valveList.isEmpty()){
          return;
      }
        Object tempOutputData = null;
        for(int i=0;i<valveList.size();i++){  //按顺序将阀门一次添加到管道执行
          DataValve valve = valveList.get(i);
          if(i==0){
            tempOutputData = valve.execute(firstInputData);     
          }else{
            tempOutputData = valve.execute(tempOutputData);
          }
        }
        this.lastOutputData = tempOutputData;
      }

      @Override
      public Object getOutputData() {
        return this.lastOutputData;
      }

      @Override
      public void setInputData(Object data) {
        this.firstInputData =data;
      }

    }

    然后关于各个阀门(处理器):

    public class Valve1SentenceSplitterImpl implements DataValve{

      @Override
      public Object execute(Object input) {

        if (input==null || !(input instanceof String)) {
          return null;
        }
        List<String> result = Lists.newArrayList();
        List<String> list = RegexUtil.splitTextSentence((String)input);
        if(CollectionUtils.isEmpty(list)){
          return result;
        }

        //...具体业务需要的逻辑代码处理
        return result;
      }

    }

    //....其余阀门结构类似。

    最后调用管道结构代码去实现:

    public class DataProcessingTest {
      @Autowired
      private DataPipeline dataPipeline;

      

    @Test
    public void testAll() {
    String id = "********";
    Document doc = mongoDao.getDocById(MongoDao.********, id);
    if (doc == null) {
    return;
    }
    String content = Jsoup.parse(doc.getString("content")).text();
    dataPipeline.init();    //初始化
    dataPipeline.setInputData(content);   //设置第一个输入元素
    dataPipeline.addValve(new Valve1SentenceSplitterImpl());  //依次添加阀门对数据进行处理(就像自来水厂对水进行各种处理一样)
    dataPipeline.addValve(new Valve2DataRuleImpl());
    dataPipeline.addValve(new ValveDataPersistenceImpl(mongoDao));
    dataPipeline.execute();
    }

    }

  • 相关阅读:
    linux进程管理
    使用PL/SQL Developer 学习pl/sql
    Linux入门到放弃之一《在VMware虚拟机中安装Linux系统(RedHat)》
    解决Java连接Oracle 12c存在的问题
    Linux安装64位Mysql5.7.22
    在centos下启动nginx出现Failed to start nginx.service:unit not found
    windows10下IntelliJ IDEA使用logback设置日志输出目录
    Windows下mysql5.6升级到5.7的方法
    Spring+Hibernate+Struts2整合之实现登录功能
    Hibernate关系映射之many-to-many(多对多)
  • 原文地址:https://www.cnblogs.com/yzf666/p/7344381.html
Copyright © 2011-2022 走看看