我有一个非常糟糕的类,有两种方法可以在服务可用时启动或停止某些服务。像下面的东西(它们不是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();
}
}
你建议我使用任何设计模式让它更漂亮吗?
谢谢!
答案 0 :(得分:4)
取决于;我的第一反应是将服务存储在散列或数组中。每个服务都实现了一个带有start和stop方法的接口。启动或停止服务则只需要服务密钥或索引。
它可能仍然有点脆弱但是,如果不知道更多,我不确定如何“域化”,所以它看起来更像你正在做的事情。
答案 1 :(得分:4)
您可以使用策略模式。
这个想法是你应该知道在实例化你的类时你将使用什么策略(或者你可以动态地改变它)。因此,您可以在实例化时传递该策略(并可选择稍后替换它)。
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();
}
}
}
答案 2 :(得分:2)
使用对象,其中有一个服务列表,您可以使用继承的方法stop()关闭它们。
public interface Service {
void start();
void stop();
}
public class TestService implements Service {
@Override
void start() {
}
@Override
void stop() {
}
}
每个服务还可以存储其状态,以便仅在它们打开时关闭它们。
答案 3 :(得分:0)
Switch语句不那么令人困惑。如果与枚举代码一起使用,则代码变得非常易读。