日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Activiti 中的 命令模式与责任链模式

發布時間:2023/12/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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異常)

public class CommandInvoker extends AbstractCommandInterceptor {private static final Logger logger = LoggerFactory.getLogger(CommandInvoker.class);@Override@SuppressWarnings("unchecked")public <T> T execute(final CommandConfig config, final Command<T> command) {final CommandContext commandContext = Context.getCommandContext();// Execute the command.// This will produce operations that will be put on the agenda.commandContext.getAgenda().planOperation(new Runnable() {@Overridepublic void run() {commandContext.setResult(command.execute(commandContext));}});// Run loop for agendaexecuteOperations(commandContext);// At the end, call the execution tree change listeners.// TODO: optimization: only do this when the tree has actually changed (ie check dbSqlSession).if (commandContext.hasInvolvedExecutions()) {Context.getAgenda().planExecuteInactiveBehaviorsOperation();executeOperations(commandContext);}return (T) commandContext.getResult();}protected void executeOperations(final CommandContext commandContext) {while (!commandContext.getAgenda().isEmpty()) {Runnable runnable = commandContext.getAgenda().getNextOperation();executeOperation(runnable);}}public void executeOperation(Runnable runnable) {if (runnable instanceof AbstractOperation) {AbstractOperation operation = (AbstractOperation) runnable;// Execute the operation if the operation has no execution (i.e. it's an operation not working on a process instance)// or the operation has an execution and it is not endedif (operation.getExecution() == null || !operation.getExecution().isEnded()) {if (logger.isDebugEnabled()) {logger.debug("Executing operation {} ", operation.getClass());}runnable.run();}} else {runnable.run();}}@Overridepublic CommandInterceptor getNext() {return null;}@Overridepublic void setNext(CommandInterceptor next) {throw new UnsupportedOperationException("CommandInvoker must be the last interceptor in the chain");}} 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Activiti 中的 命令模式与责任链模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。