管道模式

挺不錯的一個設計模式,先記下來以便之後哪裏能夠用到:設計模式

接口:數據處理管道的閥門(處理器):ide

對應實現類:this

 

接口:數據處理管道:設計

 

 對應實現類:blog

代碼:接口

public class DataPipelineImpl implements DataPipeline{ip

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

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

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

  @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;
  }it

  @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();
}

}

相關文章
相關標籤/搜索