controller
@RestController
@RequestMapping("admin/test")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {@Autowiredprivate 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 {@Resourceprivate 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);}@Overridepublic 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{@Overridepublic String supports() {return "1";}@Overridepublic String fetchVideo(String videoId) {System.out.println("1111111111111111");return "第一個"+videoId;}
}
?TestService 實現類2
@Service
public class TestTwoServiceImpl implements TestService{@Overridepublic String supports() {return "2";}@Overridepublic 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{@Overridepublic String supports1() {return "1";}@Overridepublic 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);}
}