选择设计模式需要帮助

时间:2011-03-17 16:00:34

标签: c# .net design-patterns

目前我有一堆if else语句根据每个集合中有多少项来设置CategoryId。

例如,

public class TeamWork
{
    public string EmployeeName { get; set; }
    public int CategoryId { get; set; }
}

public class BLL
{
    public void SetCategoryId(ICollection<TeamWork> Converted, ICollection<TeamWork> Sourced)
    {
        if (Converted.Count == 1 && Sourced.Count == 1)
        {                
            if (String.Compare(Sourced.First().EmployeeName, Converted.First().EmployeeName) == 0)
            {
                // set category id to 1
                Converted.First().CategoryId = 1;
                Sourced.First().CategoryId = 1;                                            
            }
            else
            {
                // set category id to something                  
            }
        }
        else if (Sourced.Rows.Count == 1 && Converted.Rows.Count > 1)
        {
            // set category id to something           
        }
        // more if else statements...
    }
}

我认为通过应用一些设计模式可以有更好的方法。有什么建议?谢谢!

2 个答案:

答案 0 :(得分:4)

Chain of responsibility是要走的路。

所以这个对象被传递给一系列命令对象,直到一个人能够对其进行操作并设置状态。

答案 1 :(得分:1)

我想到了战略模式。尝试将这些规则分解为一系列“如果这个条件成立,那么类别ID就是这个”。将这些方法中的每一个作为方法,然后将这些方法作为委托添加到List<Func<ICollection<TeamWork>, ICollection<TeamWork>, bool>>或类似的索引集合中。然后,您的SetCategoryId()代码如下所示:

public void SetCategoryId(ICollection<TeamWork> Converted, ICollection<TeamWork> Sourced)
{
    foreach(var categoryRule in CategoryRules)
    {
       var category = test(Converted, Sourced);
       if(category != 0)
       {
          Converted.First().CategoryId = Sourced.First().CategoryId = category;
          break;
       }
    }
}

无论您添加或删除了多少规则,上述代码都无需更改。但是,使用if - else if结构,您的一系列规则可能与顺序有关,因此在列表中设置规则时要小心。