0

假设我有一组数字,例如。A = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]。

还有几个规则,例如: a:数字是 3 的倍数;b:数字是5的倍数;

使用规则,很容易将原始集合分成三部分:

A_3 = [3, 6, 9, 12]
A_5 = [5, 10]
A_other = [2, 4, 7, 8, 11]

我想知道设计集合和规则类以实现目标的最佳方法:

  1. 添加或减少规则很容易
  2. 可以轻松更改集合中元素的类型

谢谢。

4

2 回答 2

7

根据我的说法,您应该使用通常在您的算法可与算法的不同变体互换时使用的策略模式。

例如,

如果您有创建像您这样的数组的代码,在某些情况下,您可能希望选择 3 的倍数,而在其他情况下,您可能希望选择 5 的倍数。

策略模式通常实现如下

用算法方法声明一个抽象基类,然后通过继承具体类来实现。在代码中的某个点,决定什么具体策略是相关的,然后它会被实例化并在任何相关的地方使用。

我不确定这是否符合您的要求。

我不能断定你只能用这个,我一直相信TIMTOWTDI

于 2012-09-10T12:13:49.100 回答
0

假设您想使用 C#,我将从以下内容开始:

// General interface to filter out whatever you want, given a list:
public interface IFilterElements<T>
{
    IEnumerable<T> Filter(IEnumerable<T> elementList);
}


// An example imlementation - add more of these as required:
class FilterElementsThatAreEven<T> : IFilterElements<T>
{
    public IEnumerable<T> Filter(IEnumerable<T> elementList)
    {
        // Some implementation to return a sorted set / list
    }
}

在您的调用方法中,您可以执行以下操作:

// List to filter
IEnumerable<int> myListOfInts = new int[]{1, 2, 3, 4, 5, 6};

// Instantiation of the implementation - also where you specify the 
// type of data to filter (could be of class "MagicLemur" instead of int)
IFilterElements<int> myIntFilter = new FilterElementsThatAreEven<int>();

var filteredList = myIntFilter.FilterElementsThatAreEven();
于 2012-09-10T12:15:22.547 回答