策略模式如何解决多个if else,写一个对比样例
时间: 2024-10-10 14:15:08 浏览: 26
策略模式可以帮助我们在处理类似情况时避免使用多个`if...else`语句,通过定义一组相关的算法或者行为,然后将它们封装成不同的策略对象,由客户端在运行时选择合适的策略。
假设我们要实现一个温度转换器,有多种不同的转换规则(例如华氏转摄氏、摄氏转华氏等),传统的`if...else`结构可能会显得冗长和难以维护:
```java
public class TemperatureConverterOldWay {
public double convertTemperature(String scale, double value) {
if (scale.equals("Fahrenheit")) {
return (value - 32) * 5 / 9; // 华氏转摄氏
} else if (scale.equals("Celsius")) {
return value * 9 / 5 + 32; // 摄氏转华氏
} else {
throw new IllegalArgumentException("Unsupported temperature scale.");
}
}
}
```
现在,我们可以使用策略模式重构这个例子:
```java
// 定义策略接口
interface TemperatureConversionStrategy {
double convert(double value);
}
// 实现策略
class FahrenheitToCelsiusStrategy implements TemperatureConversionStrategy {
@Override
public double convert(double value) {
return (value - 32) * 5 / 9;
}
}
class CelsiusToFahrenheitStrategy implements TemperatureConversionStrategy {
@Override
public double convert(double value) {
return value * 9 / 5 + 32;
}
}
// 上下文类
class TemperatureConverterNewWay {
private TemperatureConversionStrategy strategy;
public void setStrategy(TemperatureConversionStrategy strategy) {
this.strategy = strategy;
}
public double convertTemperature(String scale, double value) {
if (strategy == null) {
throw new IllegalArgumentException("Unsupported temperature scale.");
}
return strategy.convert(value);
}
}
public class Main {
public static void main(String[] args) {
TemperatureConverterNewWay converter = new TemperatureConverterNewWay();
converter.setStrategy(new FahrenheitToCelsiusStrategy());
System.out.println(converter.convertTemperature("Fahrenheit", 68)); // 输出20
converter.setStrategy(new CelsiusToFahrenheitStrategy());
System.out.println(converter.convertTemperature("Celsius", 20)); // 输出68
}
}
```
在这个新的实现中,我们定义了两个转换策略`FahrenheitToCelsiusStrategy`和`CelsiusToFahrenheitStrategy`,并在`TemperatureConverterNewWay`类中通过策略对象实现了转换,无需`if...else`判断。当我们需要添加新的转换规则时,只需要添加一个新的策略类即可,降低了代码的耦合性和维护复杂度。
阅读全文