[英]Java design, calling the associated business logic/service
我有3個對象,一個稱為BalanceDTO
的DTO,它實現了一個接口RequestDTO
和一個Balance
Entity。 我創建DTO是因為我不能使用實體,即JAXB合規性(舊版代碼)。
DTO用於Web服務層BalanceService
,並且我從Web服務集成到的API中的Entity。 在Web服務和API之間存在驗證。 RequestValidation
具有對每種RequestDTO
類型的子驗證,即BalanceRequestValidation
。
驗證組件接受RequestDTO
作為參數,然后需要對特定組件進行驗證。 在輸入時,驗證組件不知道哪個對象已傳遞給它,即BalanceDTO
,它僅看到接口。
我想避免使用instanceof,因此我考慮在DTO上使用訪問者,以便將其委托給需要在其上執行的驗證。
但是驗證不僅需要BalanceDTO
作為輸入參數,還需要更多/其他組件,並且不同的驗證需要不同的輸入參數。
是否有另一種方法可以知道您正在使用哪個對象以及無需使用instanceof即可選擇的驗證? 我可以遵循的另一種設計?
您在這里的路線正確-訪客設計模式通常是避免垂頭喪氣的最佳方法。
我將建議將visitor
和delegation
設計模式組合在一起,盡管讓我們逐步介紹一些替代方法。
讓對象自己通過RequestDTO
接口進行驗證是不可行的,因為您需要使用不同的組件,並且驗證本質上並不簡單。
使用instanceof
和downcast看起來有些混亂,並且如果您添加新的Validatable類而忘記添加驗證器,則編譯器將不會抱怨-您將通過...else { throw new IllegalArgumentException("Unknown RequestDTO subtype!"); }
...else { throw new IllegalArgumentException("Unknown RequestDTO subtype!"); }
visitor
設計模式是避免向下轉換的經典方法,如果您添加了一個應該可驗證的新類,卻忘記了添加驗證,它還會給您帶來編譯器錯誤。
您可以使用accept()
和visit()
方法,也可以使用更接近您的域的方法命名,例如validate()
,如下所示:
public interface RequestDTO {
boolean validate(RequestValidation validator);
}
public class BalanceDTO implements RequestDTO {
// ...
@Override
public boolean validate(RequestValidation validator) {
return validator.validate(this);
}
}
public class RequestValidation {
// components...
public boolean validate(BalanceDTO balanceDTO) {
return true; // todo...
}
public boolean validate(AnotherDTO anotherDTO) {
return true; // todo...
}
}
如果想進一步介紹,可以delegate
驗證delegate
給特定的驗證組件,如下所示:
public class RequestValidation {
BalanceRequestValidation balanceRequestValidation;
AnotherRequestValidation anotherRequestValidation;
public boolean validate(BalanceDTO balanceDTO) {
return balanceRequestValidation.validate(balanceDTO, a, b, c);
}
public boolean validate(AnotherDTO anotherDTO) {
return anotherRequestValidation.validate(anotherDTO, x, y, z);
}
}
鑒於我已經正確理解了您的問題,將visitor
設計模式(可能與delegation
設計模式結合使用)確實是一個好方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.