2012-11-30 152 views
3

我有一个对象集合。在这个集合中,我需要使用许多条件搜索一个对象的出现。即。使用条件1C#设计模式建议

如果条件1失败使用条件2

如果条件2失败使用条件3

如果条件3失败使用条件4

每个这些条件包括

搜索的一些过滤器。

我正在寻找关于可维护设计模式的建议。示例实现将不胜感激。

+1

你的描述相当含糊 - 一个代码示例(甚至是伪代码)会更了解你的意思,更有帮助。 – Oded

+0

将尽力而详尽。 – ntombela

回答

3

看起来责任链:

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 
     ) 
     ) 
    ) 
    ) 
    } 
}; 
+0

的确,它的责任链。 – Atul

0

这感觉就像一个工厂的某种战略可能会启动你在正确的道路上。

+0

谢谢大卫。这就是我的想法。 – ntombela

0

你可以用这样的事情对于每个过滤器实现启动:

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)); 
    } 
}