之前有講到要支援yml、properties、xml、json、介面的形式註冊流程模型,為了體現職責單一原則,我們需要把一種格式解析的邏輯獨立處理,為了體現對擴展開發,對修改關閉原則,我們先定義一組接口,然後通過工廠模式提供對應的實現邏輯;這裡工廠是使用者,透過介面呼叫具體的實現,實現在這裡是提供者,又是一組策略模式。
流程載入我們需要知道其他的幾個需求功能點:1、提供對外統一存取介面;2、提供執行記錄和執行耗時;3、不同流程節點需要定義不同的解析器;4、透過工廠建立解析類型;5、流程節點依照順序執行。
透過不同的節點類型執行不同的解析方式,顯而易見這裡需要用工廠模式去做解析類別創建,而且需要做到對外擴充開發對修改關閉,新增節點不用動其他程式碼邏輯,只要在工廠函數裡面加入一個節點解析器;同時我們這裡定義一個Map集合用於在載入工廠函數的時候就把解析對象創建,而不用每次解析的時候再去創建解析器,減少不必要的內存
代碼如下:
<code>public class NodeComponentFactory {<br><br> private final static Map<string> cacheParser = new HashMap();<br><br> static {<br> cacheParser.put(NodeParserEnum.method.name(),new MethodNodeComponent());<br> cacheParser.put(NodeParserEnum.bean.name(),new BeanNodeComponent());<br> cacheParser.put(NodeParserEnum.condition.name(),new ConditionNodeComponent());<br> cacheParser.put(NodeParserEnum.service.name(),new ServiceNodeComponent());<br> cacheParser.put(NodeParserEnum.subflow.name(),new SubFlowNodeComponent());<br> }<br><br> public static NodeParser getNodeInstance(String nodeName){<br> return cacheParser.get(nodeName);<br> }<br>}<br></string></code>
當我們發現每一種節點解析類型都需要去實現parser接口,而且每個節點都有類似的步驟,那我們這裡就要考慮用抽象工廠,也符合一個依賴倒置的的設計原則,上層模組透過依賴接口訪問,下次模組繼承抽象類,同時也用到了策略模式做介面呼叫;在實現的邏輯過程我們會發現很多步驟是重複的,例如初始化入參、執行記錄,所有我們把重複的內容放到抽象類,透過模板模式的方式,讓流程節點只專注於解析層面;
<code>public abstract class AbstractNodeComponent implements NodeParser{<br><br> public Map<string node> nodeMap;<br><br><br> /**<br> * 初始化参数<br> * @param inputUrl<br> * @param baseInput<br> * @return<br> */<br> public BaseInput initInput(String inputUrl, BaseInput baseInput){<br> BaseInput baseInputTarget = ClassUtil.newInstance(inputUrl, BaseInput.class);<br> BeanUtils.copyProperties(baseInput,baseInputTarget);<br> return baseInputTarget;<br> }<br><br><br> /**<br> * 解析节点信息<br> * @param node 节点信息<br> * @param baseInput 请求参数<br> * @param baseTemp 临时上下文<br> * @return<br> */<br> public BaseOutput parserNode(Node node, BaseInput baseInput, BaseTemp baseTemp){<br> baseTemp.setFlowRecord(baseTemp.getFlowRecord().append(FlowConstants.NODEKEY+FlowConstants.NODE+FlowConstants.COLON+node.getId()));<br> BaseOutput baseOutput = parser(node, baseInput, baseTemp);<br> return baseOutput;<br> };<br><br> @Override<br> public void setNodeMap(Map<string node> nodeMap) {<br> this.nodeMap = nodeMap;<br> }<br><br> @Override<br> public abstract BaseOutput parser(Node node, BaseInput baseInput, BaseTemp baseTemp);<br><br>}</string></string></code>
流程執行我們需要把元件分的很細,最好是獨立實現一個功能的類別劃分成一個元件,體現職責單一原則,也只要把執行功能劃分的很細,才能在流程執行的各個流程中靈活組合;在下面流程圖中可以看到幾個元件,第一個是流程統一執行的入口,這裡會有兩個地方會用到,第一個就是給外部呼叫的接口,第二個是子流程執行的入口;第二個元件是節點統一載入管理元件也就是上文提到的工廠類別;第三個是每個元件自己的解析器,用來實現不同類型節點的操作;在設計的過程中一定知道流程、管理、節點之間的邊界,減少耦合,只有這樣不同的組件才能靈活組成。
以上是java怎麼實作一個流程編排框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!