鸣谢:如果您觉得本文对您有帮助,请点赞和收藏,Thanks。
定义
策略模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
工厂模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
缺点和改进
策略模式:暴露了策略类,每次使用策略都要new一个新的对象。可以使用工厂模式生产策略类。
代码如下
策略枚举类
public enum StrategyEnum {
//策略1
CONCRETESTRATEGY1("ConcreteStrategy1", "策略1"),
//策略2
CONCRETESTRATEGY2("ConcreteStrategy2", "策略2");
private String strategyName;
private String strategyDesc;
StrategyEnum(String strategyName, String strategyDesc) {
this.strategyName = strategyName;
this.strategyDesc = strategyDesc;
}
public String getStrategyName() {
return strategyName;
}
}
策略工厂,用于保存和获取策略
public class Factory {
private static Map<String, Strategy> factory = new ConcurrentHashMap<>();
/**
* 生产策略产品
*/
static {
factory.put(StrategyEnum.CONCRETESTRATEGY1.getStrategyName(), new ConcreteStrategy1());
factory.put(StrategyEnum.CONCRETESTRATEGY2.getStrategyName(), new ConcreteStrategy2());
}
/**
* 获取策略
*
* @param strategyName
* @return
*/
public static Strategy getStrategy(String strategyName) {
return factory.get(strategyName);
}
/**
* 注册策略
*
* @param strategyName
* @param Strategy
*/
public static void register(String strategyName, Strategy Strategy) {
factory.put(strategyName, Strategy);
}
}
策略接口
public interface Strategy {
/**
* 策略要执行的方法
*/
void strategyMethod();
}
具体策略1
public class ConcreteStrategy1 implements Strategy {
/**
* 策略方法
*/
@Override
public void strategyMethod() {
System.out.println("具体策略1的执行方法");
}
}
//如果是SpringBoot项目,策略类可以这样写,让策略类自动注册到工厂中,
//工厂类里面就无需用静态代码库来生成策略产品
/*
@Service
public class ConcreteStrategy1 implements Strategy, InitializingBean {
@Override
public void strategyMethod() {
System.out.println("具体策略1的执行方法");
}
@Override
public void afterPropertiesSet() throws Exception {
Factory.register(StrategyEnum.CONCRETESTRATEGY1.getStrategyName(), this);
}
}
*/
具体策略2
public class ConcreteStrategy2 implements Strategy {
/**
* 策略方法
*/
@Override
public void strategyMethod() {
System.out.println("具体策略2的执行方法");
}
}
Main方法
public class Application {
public static void main(String[] args) {
Strategy strategy1 = Factory.getStrategy("ConcreteStrategy1");
strategy1.strategyMethod();
Strategy strategy2 = Factory.getStrategy("ConcreteStrategy2");
strategy2.strategyMethod();
}
}