繁体   English   中英

避免多个ifs的设计模式

[英]A design pattern to avoid multiple ifs

我有一个非常糟糕的类,有两种方法可以在服务可用时启动或停止某些服务。 像下面这样的东西(它们不是if-elses,只是如果):

void startServices() { 
if (service1 == true) { 
  start1();
}
if (service2 == true) { 
  start2();
} if (serviceN == true) { 
  startN();
} 
} 


void stopServices() { 
if (service1 == true) { 
  stop1();
}
if (service2 == true) { 
  stop2();
}
if (serviceN == true) { 
  stopN();
}

}

你推荐我任何设计模式让它更美观吗?

谢谢!

要看; 我的第一反应是将服务存储在散列或数组中。 每个服务都实现了一个带有start和stop方法的接口。 启动或停止服务则只需要服务密钥或索引。

它可能仍然有点脆弱,但不知道更多我不知道如何“域化”,所以它看起来更像你正在做的事情。

您可以使用策略模式。

我们的想法是,您应该知道在实例化类时要使用的策略(或者您可以动态地更改它)。 因此,您可以在实例化时传递该策略(并可选择稍后替换它)。

public interface IStartupStrategy
{
    void Start();
}

public interface IStopStrategy
{
    void Stop();
}

public class MyClass
{
    private readonly IEnumerable<IStartupStrategy> startupStrategies;
    private readonly IEnumerable<IStopStrategy> stopStrategies;

    public MyClass(IEnumerable<IStartupStrategy> startup, IEnumerable<IStopStrategy> stop)
    {
        this.startupStrategies = startup;
        this.stopStrategies = stop;
    }

    public void Start()
    {
        foreach(var strategy in this.startupStrategies)
        {
            strategy.Start();
        }
    }

    public void Stop()
    {
        foreach(var strategy in this.stopStrategies)
        {
            strategy.Stop();
        }
    }
}

使用对象,其中有一个服务列表,您可以使用继承的方法stop()关闭它们。

public interface Service {
  void start();
  void stop();
}

public class TestService implements Service {
  @Override
  void start() {
  }

  @Override
  void stop() {
  }
}

每个服务还可以存储其状态,以便仅在它们打开时关闭它们。

切换语句不那么令人困惑。 如果与枚举代码一起使用,则代码变得非常易读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM