簡體   English   中英

Java設計,調用相關的業務邏輯/服務

[英]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即可選擇的驗證? 我可以遵循的另一種設計?

您在這里的路線正確-訪客設計模式通常是避免垂頭喪氣的最佳方法。

我將建議將visitordelegation設計模式組合在一起,盡管讓我們逐步介紹一些替代方法。

讓對象自己通過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.

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