Command 模式在 SAP Spartacus 中的具體應用一例

注销發表於2022-02-22

在物件導向的程式設計中,命令模式是一種行為設計模式,其中物件用於封裝執行操作或稍後觸發事件所需的所有資訊。 此資訊包括方法名稱、擁有該方法的物件和方法引數的值。

與命令模式相關的四個術語是命令、接收者、呼叫者和客戶端。 命令物件知道接收者並呼叫接收者的方法。 接收器方法的引數值儲存在命令中。 執行這些方法的接收者物件也透過聚合儲存在命令物件中。 然後,當呼叫 command 中的 execute() 方法時,接收者會完成工作。 呼叫者物件知道如何執行命令,並且可以選擇對命令執行進行記錄。 呼叫者對具體命令一無所知,它只知道命令介面。 呼叫者物件、命令物件和接收者物件由客戶端物件持有,客戶端決定將哪些接收者物件分配給命令物件,以及將哪些命令分配給呼叫者。 客戶端決定在哪些點執行哪些命令。 為了執行命令,它將命令物件傳遞給呼叫者物件。

下面是 command 模式在 SAP Spartacus 中的具體實現。

點 email address 之前,user 模組並沒有被載入。

點選之後的 HTTP 請求:

http://localhost:4299/feature...

點了 save 按鈕之後,其 form 的 onSubmit 方法被呼叫:

onSubmit 呼叫 this.service.save 方法。

UpdateEmailComponentService 的依賴 userEmail, 型別為 UserEmailFacade,其 update 方法的實現是一個 command 模式。

facade 最後 delegate 到具體的實現類:

使用依賴注入進行實現類的例項化:

首先使用 this.command.create 建立一個 Command 例項,型別為 Command,傳入一個型別引數,包含 password 和 newUid 兩個欄位。

create 方法接收兩個引數,commandFactory 是一個工廠函式,接收具體待執行的 action 的輸入引數 payload.

工廠函式具體在這裡得到執行:

生成一個新的 command 例項,然後返回。

稍後 email service 的 update 方法被呼叫。

呼叫剛剛返回的 command 例項的 execute 方法。

進入了剛剛返回的動態建立 command 例項的 execute 方法。

最終呼叫到了我們呼叫 create 建立 command 例項時傳入的工廠方法的 wrapper 程式碼處:

cmd 就是工廠函式的輸入引數:

這裡工廠函式本身也是 rxjs 呼叫,並沒有直接執行第 30 行的 connector.updateEmail 方法。

這個方法的具體呼叫還是在 command.execute 裡透過 commands$.next 被執行。

最後拿到了 currentid,作為引數傳遞給 update email connector:

修改郵件地址的 url:https://localhost:9002/occ/v2...

payload:

沒有 response。

更多Jerry的原創文章,盡在:"汪子熙":

相關文章