挺不錯的一個設計模式,先記下來以便之後哪裏能夠用到:設計模式
接口:數據處理管道的閥門(處理器):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();
}
}