实现策略模式而不是几个 if 语句

Han*_*ody 5 c# design-patterns if-statement

我有很多这个方法if statements,其中我SharePoint list根据员工职位进行过滤。结果是query string 作为参数传递给另一个方法QuerySPList

 public List<Phone> GetListOfPhones(Employee emp)
 {
    List<Phone> records = new List<Phone>();
    string query = string.Empty;

    if (emp.Positions.Count == 1 && emp.Positions[0] == "Regular")
    {
       query = "";// some querystring                              
    }


    if (emp.Positions.Count == 1 && emp.Positions[0] == "OfficeDirector")
    {   
       query = "";// some querystring    
    }

    if (emp.Positions.Count == 1 && emp.Positions[0] == "Admin")
    {
        query = "";// some querystring 
    }              

    if (emp.Positions.Count == 2 && emp.Positions.Contains("Regular") && emp.Positions.Contains("OfficeDirector"))
    {

      query = "";// some querystring 

     }

   var rawItems = QuerySPList(query);

   foreach (SPListItem item in rawItems)
   {
        //business logic 
   }
   return records;
}}
Run Code Online (Sandbox Code Playgroud)

我读过通过实施strategy pattern我们可以避免大量代码混乱if,但是,我是开发和设计模式的新手,所以我几乎不需要帮助,所以如果有人可以指导我我该怎么做并给我建议,随时回答我的问题。我有想法,但我认为我走错了方向。想法是创建interfaceIRoleHandler 然后将其实现为 3 classes,例如。RoleAdmin ,RoleRegular,RoleOfficeDirector类似这样的事情:

public interface IRoleHandler<T>
{
    string handleRole(T obj);
}
public class RoleAdmin:IRoleHandler<Employee>
{

    public string handleRole(Employee emp)
    {
        if (emp.Positions.Count == 1 && emp.Positions[0] == "Admin")
        {
            //return some string query
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

然后想法是创建dictionary,像这样:

Dictionary<string, IRoleHandler<Employee>> strategyHandlers = new Dictionary<string, IRoleHandler<Employee>>();
        strategyHandlers.Add("Admin", new RoleAdmin());
        strategyHandlers.Add("Regular", new RoleRegularUser());
Run Code Online (Sandbox Code Playgroud)

fab*_*tto 3

我不认为策略模式是你想要的。我只是重构您的代码以将其提取ifs到另一种方法。

public List<Phone> GetListOfPhones(Employee emp)
{
   List<Phone> records = new List<Phone>();
   string query = BuildQueryByEmployeePosition(emp);

   var rawItems = QuerySPList(query);

   foreach (SPListItem item in rawItems)
   {
        //business logic 
   }
   return records;
}

private string BuildQueryByEmployeePosition(Employee emp) 
{
    if (emp.Positions.Count == 1 && emp.Positions[0] == "Regular")
        return "";// some querystring    

    if (emp.Positions.Count == 1 && emp.Positions[0] == "OfficeDirector")
        return "";// some querystring    

    if (emp.Positions.Count == 1 && emp.Positions[0] == "Admin")
        return "";// some querystring    

    if (emp.Positions.Count == 2 && emp.Positions.Contains("Regular") && emp.Positions.Contains("OfficeDirector"))
        return "";// some querystring    

    return ""; // some default query
}
Run Code Online (Sandbox Code Playgroud)

这是策略模式的精彩解释的链接(带有排序算法的真实示例)。

很高兴看到您是编程新手并且正在研究模式,但要注意:在不需要它们时使用它们是一种反模式。