簡體   English   中英

這是立面模式嗎? 如果沒有,那又如何?

[英]Is this the Facade pattern? If not then what?

我試圖弄清楚這種設計模式是什么。 當我具有需要在單個對象上執行/為單個對象執行的通用邏輯時,經常使用它。

我在想Facade嗎?

例如Validation

公共接口

public interface IValidator<T>
{
    void Validate(T obj);
}

多種實現

public class CodeValidator<T> : IValidator<T> { public void Validate(T obj) { } }
public class PerfValidator<T> : IValidator<T> { public void Validate(T obj) { } }
public class DotValidator<T> : IValidator<T> { public void Validate(T obj) { } }
public class NetfValidator<T> : IValidator<T> { public void Validate(T obj) { } }

然后,一個類采用IValidatorCollection或直接的IEnumerable<IValidator> ,后者將注入所有已注冊的驗證器。

public class PostValidaitonController
{
    private IEnumerable<IValidator<Post>> _validators;

    public PostValidaitonController(IEnumerable<IValidator<Post>> validators)
    {
        _validators = validators;
    }

    public void Validate(Post post)
    {
        foreach (var validator in _validators)
        {
            validator.Validate(post);
        }
    }
}

編輯

我知道這使用IoC / DI注入IValidator<T>的集合, IValidator<T>不是我要尋找的模式。 它是在單個interface / class后面隱藏interface多個實現的模式

您所提供的示例是Strategy模式的一個很好的示例。

驗證者策略的實施者和驗證者的用戶都依賴於抽象IValidator。

這使Validation用戶不必關心特定Validation操作的細節。

這也使驗證實施者不必關心如何或何時執行給定的驗證。

編輯:實際上,在策略模式的Wiki條目下,它明確提到了Validation:

例如,對傳入數據執行驗證的類可以使用策略模式基於數據類型,數據源,用戶選擇或其他區分因素來選擇驗證算法。 在每種情況下,直到運行時,這些因素都是未知的,並且可能需要進行根本不同的驗證。 與驗證對象分開封裝的驗證策略可以由系統(甚至不同系統)不同區域中的其他驗證對象使用,而無需代碼重復。

最接近的匹配恕我直言實際上是橋接模式,但實際上不是。 您正在將驗證規則/邏輯與Validate方法脫鈎。 當客戶端依靠Validate方法時,您實際上可以根據某種標准動態修改規則。

我之前寫過這樣的代碼,盡管稍微復雜一點(例如,驗證規則的順序可以動態配置),但我個人不會將其歸類為任何模式。 您很容易使用依賴項注入將驗證規則與實際驗證過程脫鈎。

就是說,我不喜歡注入列表驗證。 您可能需要考慮將其重構為策略模式(例如ValidationStrategy ),然后將Validate方法移到其中。 現在,您的大多數控制器都獲得了這種“長”類型,這種類型的可讀性不高,此外,您必須將“ Validate”方法復制到每個控制器,或者將其移至基類(我認為這不是。)是正確的地方)。

附言:對我來說,您當前的解決方案看起來不像策略。 也許是“明智的實現”,但重點是要正確實現意圖,因為無論如何,某些模式的實現都非常相似,但意圖不同。

暫無
暫無

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

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