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