在多场景的代码中,需要根据前端传来的参数走不同的代码逻辑,例如:
public static void main(String[] args) {
String code = "前端传来的场景码";
String param = "前端传来的参数";
if (("0001").equals(code)) {
System.out.println("开始执行场景0001的逻辑,参数" + param);
} else if (("0002").equals(code)) {
System.out.println("开始执行场景0002的逻辑,参数" + param);
} else if (("0003").equals(code)) {
System.out.println("开始执行场景0003的逻辑,参数" + param);
} else if (("0004").equals(code)) {
System.out.println("开始执行场景0004的逻辑,参数" + param);
} else if (("0005").equals(code)) {
System.out.println("开始执行场景0005的逻辑,参数" + param);
} else if (("0006").equals(code)) {
System.out.println("开始执行场景0006的逻辑,参数" + param);
} else {
System.out.println("场景编码不合适");
}
}
每当有新的场景需要走新的逻辑的时候,就会需要修改代码,添加新的else if判断,这种情况修改同一个类的代码很容易不小心修改了前面的逻辑,可能把以前已经写好的代码弄出bug
在设计模式中,有几个准则,其中一个准则是 “对修改关闭,对新增开放”,意思是当有新需求来的时候,尽量不修改代码,只新增代码,那么就可以用以下的代码来实现:
###策略主类
package com.example.strategy;
import java.util.HashMap;
import java.util.Map;
public class Strategy {
private static Strategy instance = new Strategy();
public static Strategy GetInstance() {
return instance;
}
private static final Map<String, AbstractStrategy> map = new HashMap<>();
public static void excute(String code, String param) {
map.get(code).excute(param);
}
abstract public class AbstractStrategy {
public abstract String getSceneCode();
public abstract void excute(String param);
public AbstractStrategy() {
map.put(this.getSceneCode(), this);
}
}
public static void main(String[] args) {
String code = "前端传来的场景码";
String param = "前端传来的参数";
Strategy.excute("code",param);
}
}
#策略实现类0001
package com.example.strategy;
@Component
public class Strategy0001 extends Strategy.AbstractStrategy {
Strategy0001() {
//类上添加@Component注解, spring初始化bean时,会调用父类的构造函数,将当前bean注册到map中
Strategy.GetInstance().super();
}
@Override
public String getSceneCode() {
return "0001";
}
@Override
public void excute(String param) {
System.out.println("开始执行场景0001的逻辑,参数为:" + param);
}
}
#策略实现类0002
package com.example.strategy;
@Component
public class Strategy0002 extends Strategy.AbstractStrategy {
Strategy0002() {
//类上添加@Component注解, spring初始化bean时,会调用父类的构造函数,将当前bean注册到map中
Strategy.GetInstance().super();
}
@Override
public String getSceneCode() {
return "0002";
}
@Override
public void excute(String param) {
System.out.println("开始执行场景0002的逻辑,参数为:" + param);
}
}
通过以上代码,每当有新的业务场景来的时候,不用修改已经上线的代码,只需新增场景代码类,达到”对修改关闭,对新增开放”的效果。