[英]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.