Java 枚举实现策略模式
策略模式是一种常见的设计模式,它可以将算法的实现与使用它的代码分离,从而实现更好的代码重用和扩展性。Java中可以使用枚举来实现策略模式,下面是一个基于枚举和工厂方法的策略模式实现的代码:
- 定义共同行为接口:
public interface IStrategy {
void doSomething();
}
- 具体策略实现类:
public class ConcreteStrategyA implements IStrategy {
@Override
public void doSomething() {
System.out.println("ConcreteStrategyA.doSomething()");
}
}
public class ConcreteStrategyB implements IStrategy {
@Override
public void doSomething() {
System.out.println("ConcreteStrategyB.doSomething()");
}
}
public class ConcreteStrategyC implements IStrategy {
@Override
public void doSomething() {
System.out.println("ConcreteStrategyC.doSomething()");
}
}
- 定义枚举,保存策略实现类具体路径:
public enum StrategyEnum {
STRATEGY_A(ConcreteStrategyA.class),
STRATEGY_B(ConcreteStrategyB.class),
STRATEGY_C(ConcreteStrategyC.class);
private Class<? extends IStrategy> strategyClass;
StrategyEnum(Class<? extends IStrategy> strategyClass) {
this.strategyClass = strategyClass;
}
public IStrategy getStrategy() {
try {
return strategyClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
- 策略工厂:
public class StrategyFactory {
public static IStrategy getStrategy(StrategyEnum strategyEnum) {
return strategyEnum.getStrategy();
}
}
- 使用策略工厂获取具体策略实现:
public class Client {
public static void main(String[] args) {
IStrategy strategyA = StrategyFactory.getStrategy(StrategyEnum.STRATEGY_A);
strategyA.doSomething();
IStrategy strategyB = StrategyFactory.getStrategy(StrategyEnum.STRATEGY_B);
strategyB.doSomething();
IStrategy strategyC = StrategyFactory.getStrategy(StrategyEnum.STRATEGY_C);
strategyC.doSomething();
}
}
这样,我们就可以使用枚举和工厂方法来实现策略模式。这种实现方式的优点是:
- 可以避免使用大量的if-else语句。
- 代码可读性高,易于维护和扩展。
- 可以通过枚举来管理策略,方便管理和使用。
需要注意的是,使用枚举实现策略模式时,枚举中的每个元素都应该与一个具体的策略实现类对应,这个实现类应该实现策略接口。同时,枚举中应该提供一个方法来获取对应的策略实现类,这个方法可以使用工厂方法来实现。在使用时,只需要通过枚举元素来获取对应的策略实现类,然后调用策略接口。