如何将这4个功能合二为一?

时间:2011-07-10 12:14:24

标签: c# c#-2.0 factory-pattern

您可以使用枚举:enum StatusRouter { Stop = 0, Start, Resume, Suspect };

public bool StartSelectedRouter()
{
    for (int i = 0; i < m_listPlatforms.Count; i++)
    {
        if (m_listPlatforms[i].IsCheked)
            m_listPlatforms[i].Start();
    }
    return false;
}
public bool ResumeSelectedRouter()
{
    for (int i = 0; i < m_listPlatforms.Count; i++)
    {
        if (m_listPlatforms[i].IsCheked)
            m_listPlatforms[i].Resume();
    }
    return false;
}
public bool SuspendSelectedRouter()
{
    for (int i = 0; i < m_listPlatforms.Count; i++)
    {
        if (m_listPlatforms[i].IsCheked)
            m_listPlatforms[i].Suspend();
    }
    return false;
}
public bool StopSelectedRouter()
{
    for (int i = 0; i < m_listPlatforms.Count; i++)
    {
        if (m_listPlatforms[i].IsCheked)
            m_listPlatforms[i].Stop();
    }
    return false;
}

6 个答案:

答案 0 :(得分:7)

你可以传入一个lambda来定义你想对每个元素做的Action。

类似的东西:

public bool ChangeSelectedRouterState(Action<Router> action) 
{
    for (int i = 0; i < m_listPlatforms.Count; i++)
    {
        if (m_listPlatforms[i].IsCheked)
            action(m_listPlatforms[i]);
    }
    return false;
}

这样打电话:

ChangeSelectedRouterState(r => r.Stop());

您需要将我为我的答案发明的类型Router替换为您正在处理的特定类型。

答案 1 :(得分:2)

您可以通过将Action传递给执行所需操作的方法(假设您的类称为Platform)来使用策略模式 - 所以像这样:

    public bool ActionSelectedRouter(Action<Platform> action)
    {
        for (int i = 0; i < m_listPlatforms.Count; i++)
        {
            if (m_listPlatforms[i].IsCheked)
                action(m_listPlatforms[i]);
        }
        return false;            
    }

答案 2 :(得分:1)

您提取重复部分,循环并传递您想要执行的操作:

public bool DoSelectedRouter(StatusRouter statusRouter)
{
    for (int i = 0; i < m_listPlatforms.Count; i++)
    {
        if (m_listPlatforms[i].IsCheked)
        {
            switch(statusRouter)
            {
               case StatusRouter.Stop:
                 m_listPlatforms[i].Stop();
                 break;
               case StatusRouter.Resume:
                 m_listPlatforms[i].Resume();
                 break;       
                 .......
            }
        }            
    }
    return false;
}

当然,您可以随时丢弃枚举并传递您想要执行的功能代理。

答案 3 :(得分:0)

您可以将DoAction复制到该函数中,但这更具可读性

public bool DoActionSelectedRouter(StatusRouter action)
{
    for (int i = 0; i < m_listPlatforms.Count; i++)
    {
        if (m_listPlatforms[i].IsCheked)
        {
            DoAction(m_listPlatforms[i], action);
        }
    }
    return false;
}

private void DoAction(Platform platform,StatusRouter  action)
{
     switch(action){
         case(StatusRouter.Stop):
         {
                platform.Stop();
                break;
         }
         case(StatusRouter.Start):
         {
                platform.Start();
                break;
         }
         case(StatusRouter.Suspend):
         {
                platform.Suspend();
                break;
         }
         case(StatusRouter.Resume):
         {
                platform.Resume();
                break;
         }
     }
}

答案 4 :(得分:0)

Public bool StartRouterAction(StatusRouter Action)
{

switch(Action)
{
    case StatusRouter.Start:

// your start action

break; 

  case StatusRouter.Resume:

// your Resume action

  break; 

  case StatusRouter.Suspend:

  // your suspend action

       break; 


case StatusRouter.Stop:

 // your stop action

 break; 

}

}

答案 5 :(得分:0)

首先,我将单个路由器的状态设置分解为单独的功能。我将此函数作为Router类的成员。

然后我会编写一个帮助函数来获取所有已检查的路由器。最后是一个在每个函数上调用SetRouterStatus函数的函数。

这样每个职能都有一个责任,可以重复使用。

您的代码的一些其他问题: Cheked应为Checked,而Suspect应为Suspend

为什么你的函数会返回始终为假的bool

public void SetSelectedRoutersStatus(StatusRouter status)
{
    foreach(var router in GetCheckedRouters())
    {
        SetRouterStatus(router);
    }
}

IEnumerable<Router> GetCheckedRouters()
{
    return m_listPlatforms.Where(router=>router.Checked);
}

void SetRouterStatus(Router router,StatusRouter status)
{
     switch(status)
     {
         case(StatusRouter.Stop):
         {
                router.Stop();
                break;
         }
         case(StatusRouter.Start):
         {
                router.Start();
                break;
         }
         case(StatusRouter.Suspend):
         {
                router.Suspend();
                break;
         }
         case(StatusRouter.Resume):
         {
                router.Resume();
                break;
         }
         default:
           throw new NotSupportedException("Invalid StatusRouter");
     }
}

(基于@ peer的回答)