我想弄清楚这个设计模式是什么 . 当我有一个需要在单个对象上执行的共同逻辑时,我经常使用它 .
我想也许 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 回答
你给出的例子是 Strategy pattern 的一个很好的例子 .
Validator策略的实现者和Validator的用户都依赖于抽象IValidator .
这使验证用户无需关心特定验证操作的详细信息 .
这也使Validation实施者无法关注如何或何时执行给定的验证 .
Edit: 事实上,在策略模式的wiki条目下,它明确提到了验证:
最接近的匹配imho实际上是bridge模式,但不是真的 . 您正在将验证规则/逻辑与
Validate
方法分离 . 虽然客户端依赖于Validate
方法,但您实际上可以根据某种标准动态修改规则 .我之前编写过这样的代码,虽然有点复杂(例如,验证规则的顺序可以动态配置),我不会将其归类为任何模式 . 您可以很容易地使用依赖注入将验证规则与实际验证过程分离 .
也就是说,我不喜欢注入列表验证 . 您可能需要考虑将其重构为策略模式(例如
ValidationStrategy
),并将Validate方法移动到那里 . 现在,你的大多数控制器都得到了"long"类型,这不是那么可读,而且,你认为是正确的地方) .Ps,对我来说,你目前的解决方案看起来并不像战略 . 也许“实施明智”,但关键是要使意图正确,因为一些模式无论如何都实现得非常相似,但其意图不同 .