为工作中避免使用大量的if-else,而使用策略模式:
1.提供一个公共的方法入口
2.定义自己想要实现的实现类(实现类会有多种)
3.实现类注上指定的ServiceID,入口根据不同的传参,进入不同的实现类
示例代码如下:
1. 首先定义多个唯一的ServiceId,用于标注不同的实现类
public interface ServiceCode {
/**
* 自定义Service编码1
*/
String SERVICE_ONT = "SERVICE_ONT";
/**
* 自定义Service编码2
*/
String SERVICE_TWO = "SERVICE_TWO";
}
2. 定义可执行各种实现类的接口,注意! 这里的接口是泛型的,使用泛型的好处是可以根据不同需要,执行不同效果;
public interface DoService<T> {
/**
* 开始执行各种自己定义的类
* @param modifyReqVO
*/
void doSomeThing(List<T> modifyReqVO);
}
3. 定义公共方法入口和其实现类,这里就是一个策略模式的中转站,也是其核心所在,因为所有的方法都会从already进入,通过serviceMap得到不同的实现类对象;
public interface AlreadyService {
/**
* 策略模式的方法入口
* @param serviceCode 服务编码
* @param modifyReqVO 泛型入参
* @param <T>
*/
<T> void already(String serviceCode, List<T> modifyReqVO);
}
@Service
public class CommonAlreadyServiceImpl implements AlreadyService {
// 通过注解的方法,初始化serviceMap, 注入(实现DoService方法的定义类)服务编码 以及 定义类的地址
@Autowired
private Map<String, DoService> serviceMap;
@Override
public <T> void already(String serviceCode, List<T> modifyReqVO) {
// 根据服务编码获取实现类
DoService doService = serviceMap.get(serviceCode);
// 执行自定义实现类
doService.doSomeThing(modifyReqVO);
}
}
3. 定义自己想要的实现类(此外我定义了抽象类,把可用复用的方法,封装到抽象类中,再通过实现类继承抽象父类,调用可复用的方法),继承了抽象父类(可要可不要),实现了DoService接口,也就是执行类的接口
自定义类1:这里我的DoService<T> 里面放的是AdminMenu这个实体类,可根据需要自定义
@Service(ServiceCode.SERVICE_ONT)// 自定义服务编码
public class ActionOneServiceImpl extends AbstractFatherService
implements DoService<AdminMenu> {
@Override
public void doSomeThing(List<AdminMenu> modifyReqVO) {
System.out.println("进入actionOne");
// 调用抽象类的方法(这里可以把一些通用的方法写到抽象类封装起来)
test1();
System.out.println(modifyReqVO.toString());
}
}
自定义类2:这里我的DoService<T> 里面放的是Book这个实体类,可根据需要自定义
@Service(ServiceCode.SERVICE_TWO) public class ActionTwoServiceImpl extends AbstractFatherService implements DoService<Book> { @Override public void doSomeThing(List<Book> modifyReqVO) { System.out.println("进入actionTwo"); test2(); } }
以上是一个小的demo,测试的时候最好使用接口去调用,而不是直接用main方法,不然@Audowired注解会失效的;
测试:
@RestController public class TestController { @Autowired private CommonAlreadyServiceImpl service; @GetMapping("/api/test") public void test() { List<AdminMenu> modifyReqVO = new ArrayList<>(); AdminMenu adminMenu = new AdminMenu(); adminMenu.setComponent("111"); adminMenu.setName("方法One"); modifyReqVO.add(adminMenu); // 这里的ServiceID 根据不同实现类传入 service.already(ServiceCode.SERVICE_ONT, modifyReqVO); } }