我有一个对象集合。在这个集合中,我需要使用许多条件搜索一个对象的出现。即。使用条件1C#设计模式建议
如果条件1失败使用条件2
如果条件2失败使用条件3
如果条件3失败使用条件4
每个这些条件包括
搜索的一些过滤器。
我正在寻找关于可维护设计模式的建议。示例实现将不胜感激。
我有一个对象集合。在这个集合中,我需要使用许多条件搜索一个对象的出现。即。使用条件1C#设计模式建议
如果条件1失败使用条件2
如果条件2失败使用条件3
如果条件3失败使用条件4
每个这些条件包括
搜索的一些过滤器。
我正在寻找关于可维护设计模式的建议。示例实现将不胜感激。
看起来责任链:
http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern
在面向对象设计,责任链模式是一个 设计模式,由命令对象的来源和处理对象的系列 组成。每个处理对象都包含一些逻辑,它们可以定义它可以处理的命令对象的类型;其余的都是 传递给链中的下一个处理对象。还有一个机制 用于将新的处理对象添加到此链的末尾。
不要挂在“命令对象”的东西太多。 CoR模式的核心在于它是一系列对象,或者自己处理工作,或者将它传递给链中的下一个对象。
实现:
public interface LinkInChain {
boolean search(final Data data, final OnFound onFound);
}
public abstract class LinkInChainBase {
final private LinkInChain nextLink;
public LinkInChainBase(final LinkInChain nextLink) {
this.nextLink = nextLink;
}
protected abstract innerSearch(final Data data, final OnFound onFound);
public boolean search(final Data data, final OnFound onFound) {
if (!innerSearch(data, onFound)) {
return nextLink.search(data, onFound);
}
}
}
public class SearchFactory {
private final LinkInChain lastLink = new LinkInChain() {
public boolean search(final Data data, final OnFound onFound) {
return false;
}
}
public LinkInChain searchChain() {
return new SearchUsingCond1(
new SearchUsingCond2(
new SearchUsingCond3(
new SearchUsingCond4(
lastLink
)
)
)
)
}
};
的确,它的责任链。 – Atul
你可以用这样的事情对于每个过滤器实现启动:
public interface IFilter<T>
{
bool Matches(T itemToMatch);
}
有关过滤器的子层(条件1,...,N),你可以使用复合“全部”过滤器这样的;所有IFilter<T>
实现包含有以匹配复合说它匹配:
public class AllMatchingCompositeFilter : List<IFilter<MyClass>>, IFilter<MyClass>
{
public bool Matches(T itemToMatch)
{
return this.All(filter => filter.Matches(itemToFilter));
}
}
...和过滤器的顶级(如果条件N不符合检查条件N + 1)你可以将多个AllMatchingCompositeFilter
组合在像这样的“任何”过滤器中;它加入他们的顺序执行它的每一个IFilter<T>
S的,如果其中任何匹配返回true:
public class AnyMatchingCompositeFilter : List<IFilter<MyClass>>, IFilter<MyClass>
{
public bool Matches(T itemToMatch)
{
return this.Any(filter => filter.Matches(itemToFilter));
}
}
你的描述相当含糊 - 一个代码示例(甚至是伪代码)会更了解你的意思,更有帮助。 – Oded
将尽力而详尽。 – ntombela