controller
@RestController
@RequestMapping("admin/test")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {
@Autowired
private VideoFactory VideoFactory;
@GetMapping("getList")
public R getList(){
// 第一种方式
TestService testService = VideoFactory.chooseStrategy("2");
System.out.println(testService.fetchVideo("1"));
Test1Service testService1 = VideoFactory.chooseStrategy1("1");
System.out.println(testService1.fetchVideo("dddd"));
return R.ok().result(testService.fetchVideo("1"));
// 第二种方式
System.out.println(VideoServiceFactory.getService("1").fetchVideo("1"));
}
}
第一种方式
策略工厂
@Component
public class VideoFactory implements InitializingBean {
@Resource
private ApplicationContext applicationContext;
private final Map<String, TestService> videoFactory = new ConcurrentHashMap<>();
private final Map<String, Test1Service> videoFactory1 = new ConcurrentHashMap<>();
public TestService chooseStrategy(String type) {
return videoFactory.get(type);
}
public Test1Service chooseStrategy1(String type) {
return videoFactory1.get(type);
}
@Override
public void afterPropertiesSet() throws Exception {
Map<String, TestService> videoFactoryMap = applicationContext.getBeansOfType(TestService.class);
videoFactoryMap.forEach((key, val) -> videoFactory.put(val.supports(), val));
Map<String, Test1Service> videoFactory1Map = applicationContext.getBeansOfType(Test1Service.class);
videoFactory1Map.forEach((key, val) -> videoFactory1.put(val.supports1(), val));
}
}
service接口
public interface TestService {
// 策略标识
String supports();
// 策略抽象接口
String fetchVideo(String videoId);
}
TestService 实现类1
@Service
public class TestOneServiceImpl implements TestService{
@Override
public String supports() {
return "1";
}
@Override
public String fetchVideo(String videoId) {
System.out.println("1111111111111111");
return "第一个"+videoId;
}
}
TestService 实现类2
@Service
public class TestTwoServiceImpl implements TestService{
@Override
public String supports() {
return "2";
}
@Override
public String fetchVideo(String videoId) {
System.out.println("22222222222222");
return "第二个"+videoId;
}
}
service1接口
public interface Test1Service {
// 策略标识
String supports1();
// 策略抽象接口
String fetchVideo1(String videoId);
}
Test1Service 实现类1
@Service
public class TestOne1ServiceImpl implements Test1Service{
@Override
public String supports1() {
return "1";
}
@Override
public String fetchVideo1(String videoId) {
System.out.println(videoId);
return "最新的"+videoId;
}
}
第二种方式
public class VideoServiceFactory {
private static final Map<String, TestService> serviceMap = new HashMap<>();
static {
serviceMap.put("1", new TestOneServiceImpl());
serviceMap.put("2", new TestTwoServiceImpl());
}
public static TestService getService(String ip) {
return serviceMap.get(ip);
}
}