Activiti 中的 命令模式与责任链模式
Activiti 中的 命令模式與責任鏈模式
類圖:
標準命令模式:
意圖:將一個請求封裝成一個對象,從而使您可以用不同的請求對客戶進行參數化。
主要解決:在軟件系統中,行為請求者與行為實現者通常是一種緊耦合的關系,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵御變化的緊耦合的設計就不太合適。
何時使用:在某些場合,比如要對行為進行"記錄、撤銷/重做、事務"等處理,這種無法抵御變化的緊耦合是不合適的。在這種情況下,如何將"行為請求者"與"行為實現者"解耦?將一組行為抽象為對象,可以實現二者之間的松耦合。
如何解決:通過調用者調用接受者執行命令,順序:調用者→命令→接受者。
關鍵代碼:定義三個角色:1、received 真正的命令執行對象 2、Command 3、invoker 使用命令對象的入口
應用實例:struts 1 中的 action 核心控制器 ActionServlet 只有一個,相當于 Invoker,而模型層的類會隨著不同的應用有不同的模型類,相當于具體的 Command。
優點: 1、降低了系統耦合度。 2、新的命令可以很容易添加到系統中去。
缺點:使用命令模式可能會導致某些系統有過多的具體命令類。
使用場景:認為是命令的地方都可以使用命令模式,比如: 1、GUI 中每一個按鈕都是一條命令。 2、模擬 CMD。
注意事項:系統需要支持命令的撤銷(Undo)操作和恢復(Redo)操作,也可以考慮使用命令模式,見命令模式的擴展。
命令模式結構示意圖:
Activiti 中的命令模式:
Invoker -》Command-》Receiver(Command實現)
CommandContext 命令上下文
該CommandContext的實例從Context獲得,使用本地線程(ThreadLocal)保存(堆棧形式)
CommandExecutor 命令執行者 --》對應Invoker
提供兩種方法執行命令,傳入CommandConfig(命令配置,方便擴展),也可以不傳入。
CommandExecutorImpl
將命令傳遞給鏈中第一個攔截器的命令執行器。如果沒有傳遞{@link CommandConfig},將使用默認配置。
ServiceImpl 命令調用者 --》即標準命令模式定義中的Client 客戶端
Activiti各個服務類,如TaskServiceImpl(任務服務)均繼承ServiceImpl,
在該服務實現類中,構造各個Command的實現類 --》即標準命令模式的received
然后傳給CommandExecutor --》即標準命令模式的invoker ,進行執行。
責任鏈模式:
責任鏈模式介紹
責任鏈模式(Chain of Responsibility Pattern)為請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬于行為型模式。
意圖:避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。
主要解決:職責鏈上的處理者負責處理請求,客戶只需要將請求發送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的發送者和請求的處理者解耦了。
何時使用:在處理消息的時候以過濾很多道。
如何解決:攔截的類都實現統一接口。
關鍵代碼:Handler 里面聚合它自己,在 HandlerRequest 里判斷是否合適,如果沒達到條件則向下傳遞,向誰傳遞之前 set 進去。
優點: 1、降低耦合度。它將請求的發送者和接收者解耦。 2、簡化了對象。使得對象不需要知道鏈的結構。 3、增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。 4、增加新的請求處理類很方便。
缺點: 1、不能保證請求一定被接收。 2、系統性能將受到一定影響,而且在進行代碼調試時不太方便,可能會造成循環調用。 3、可能不容易觀察運行時的特征,有礙于除錯。
使用場景: 1、有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時刻自動確定。 2、在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。 3、可動態指定一組對象處理請求。
Activiti 中的責任鏈
CommandInterceptor 一個自循環實現。 命令攔截器,采用命令模式實現的攔截器。作為責任鏈的“鏈節點”的定義。
除了如命令執行者CommandExecutor一樣,也可以execute命令外,還提供了對鏈條的支持,
即getNext和setNext,獲取和設置下一個鏈節點。
ProcessEngineConfigurationImpl 維護整條鏈的抽象類
在該流程引擎抽象實現類中,實現了對責任鏈的整條鏈條的維護。
在該類的initCommandInterceptors方法中,允許設置自定義前置、默認、后置和最后節點的命令攔截器。
CommandInvoker 責任鏈“鏈節點”一個實現類,負責該鏈條最后節點的命令執行。
所以該類的getNext返回null,而且不支持setNext方法(拋出Unsupported異常)
總結
以上是生活随笔為你收集整理的Activiti 中的 命令模式与责任链模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 印度航空计划引进近 300 架波音飞机
- 下一篇: spring cloud + nacos