簡體   English   中英

具有類型標識符的 API 設計模式,用於確定要調用的下游服務

[英]Design pattern for API with type identifier that determines what downstream services to call

我有一個端點,我們稱之為“GetPersonInfo”。 GetPersonInfo 有幾個參數,但其中之一是“PersonType”。 基於這個PersonType,調用多個下游服務。 其中一些服務可以在 PersonType 之間共享,但這並不能保證。

例如 GetPersonInfo(...) #1: PersonType = "Adult"

當為 Adult 調用 GetPersonInfo 時,API 端點需要進行兩次下游調用並使用結果填充負載模型:“GetPersonName()”和“GetFavoriteAlcoholicBeverage()”

例如 GetPersonInfo(...) #2: PersonType = "Child"

當為 Child 調用 GetPersonInfo 時,api 端點需要進行兩次下游調用並使用結果填充有效負載模型:“GetPersonName()”和“GetFavoriteToy()”

例如 GetPersonInfo(...) #3: PersonType = "NamelessPerson"

當為 NamelessPerson 調用 GetPersonInfo 時,api 端點需要進行一個下游調用:“GetPersonIdNumber()”

這些調用中的每一個都將填充相同的模型 PersonInfo,但所有字段都可以為空,以防該人員類型不需要下游調用。

是否有一種模式可以實現這一點,而無需在每個邏輯實現中重復常見的下游調用,以通過 PersonType 獲取人員信息。

下面是初始調用

public PersonInfo getPersonInfo(int id, PersonType personType) {
        // logic here based on personType to call necessary downstreams and populate person info model
    }

好吧,窮人的方法將是一個 if-cascade。 :-)

但是在設計模式中思考,這顯然是一種策略模式 您的每個下游都將定義一個策略,每個 PersonType 將觸發一個或多個策略。 稍后我們將討論這種多對多關系。

讓我們從一個策略界面開始......

public interface PersonStrategy {

    void enrichPerson(String id, PersonInfo result);

}

...讓我們將一些下游實施為策略:

public class DefaultStrategy implements PersonStrategy {

    @Override
    public void enrichPerson(String id, PersonInfo result) {
      // fetch basic person data ...
    }
 }

 public class FavoriteToyStrategy implements PersonStrategy {

    @Override
    public void enrichPerson(String id, PersonInfo result) {
      // fetch toys ...
    }

}

public class FavoriteAlcoholicBeverageStrategy implements PersonStrategy {

    @Override
    public void enrichPerson(String id, PersonInfo result) {
      // fetch beverages ...
    }

}

提供后,您的初始方法將如下所示:

private final Map<PersonType, List<PersonStrategy>> strategies = new LinkedHashMap<>();

public PersonInfo getPersonInfo(String id, PersonType type) {

    final PersonInfo result = new PersonInfo();
    strategies.get(type).forEach(strategy -> strategy.enrichPerson(id, result));

    return result;
}

如您所見,我在類型為 key的多值映射中實現了多對多依賴 它尚未填充,我想您可以想象它是如何工作的。

其他可能性:

  • 有一個返回屬於特定類型的策略的工廠。
  • 讓每個策略決定它是對給定類型做出反應還是提供它所屬的類型列表。

如您所見:這里不需要單個 if 語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM