首页 文章

这是Facade模式吗?如果不是那么什么?

提问于
浏览
2

我想弄清楚这个设计模式是什么 . 当我有一个需要在单个对象上执行的共同逻辑时,我经常使用它 .

我想也许 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);
        }
    }
}

EDIT

我知道这使用IoC / DI来注入 IValidator<T> 的集合,但这不是我正在寻找的模式 . 它隐藏了单个 interface / class 背后 interface 的多个实现的模式

2 回答

  • 0

    你给出的例子是 Strategy pattern 的一个很好的例子 .

    Validator策略的实现者和Validator的用户都依赖于抽象IValidator .

    这使验证用户无需关心特定验证操作的详细信息 .

    这也使Validation实施者无法关注如何或何时执行给定的验证 .

    Edit: 事实上,在策略模式的wiki条目下,它明确提到了验证:

    例如,对输入数据执行验证的类可以使用策略模式来基于数据类型,数据源,用户选择或其他区分因素来选择验证算法 . 直到运行时,这些因素对于每种情况都是未知的,并且可能需要执行完全不同的验证 . 与验证对象分开封装的验证策略可以由系统的不同区域(或甚至不同的系统)中的其他验证对象使用,而无需代码重复 .

  • 0

    最接近的匹配imho实际上是bridge模式,但不是真的 . 您正在将验证规则/逻辑与 Validate 方法分离 . 虽然客户端依赖于 Validate 方法,但您实际上可以根据某种标准动态修改规则 .

    我之前编写过这样的代码,虽然有点复杂(例如,验证规则的顺序可以动态配置),我不会将其归类为任何模式 . 您可以很容易地使用依赖注入将验证规则与实际验证过程分离 .

    也就是说,我不喜欢注入列表验证 . 您可能需要考虑将其重构为策略模式(例如 ValidationStrategy ),并将Validate方法移动到那里 . 现在,你的大多数控制器都得到了"long"类型,这不是那么可读,而且,你认为是正确的地方) .

    Ps,对我来说,你目前的解决方案看起来并不像战略 . 也许“实施明智”,但关键是要使意图正确,因为一些模式无论如何都实现得非常相似,但其意图不同 .

相关问题