0. 需要改进的代码
public void work(String workerName) {
if (workerName.equals("zhangsan")) {
System.out.println("张三正在工作...");
} else if (workerName.equals("lisi")) {
System.out.println("李四正在工作...");
} else if (workerName.equals("wangwu")) {
System.out.println("王五正在工作...");
}
}
1. Controller控制器
@RestController
@RequestMapping("/work")
public class WorkController {
@Autowired
private WorkService workService;
@RequestMapping("/do")
public void doWork(String workerName) {
workService.work(workerName);
}
}
2. 接口、实现类
2.1 工作接口
package com.itheima.strategy.newDemo.service;
public interface WorkStrategy {
void work();
}
2.2 工作实现类
@Service
public class WorkService {
@Autowired
private StrategyBeanFactory strategyBeanFactory;
/**
* 工作方法:从策略bean工厂获取对应的实现类
*
* @param workerName
*/
public void work(String workerName) {
strategyBeanFactory.getWorkStrategy(workerName).work();
}
}
2.3. 具体工作人员实现类
@Service
public class WangwuWorkImpl implements WorkStrategy {
@Override
public void work() {
System.out.println("张三在工作...");
}
}
@Service
public class LisiWorkImpl implements WorkStrategy {
@Override
public void work() {
System.out.println("李四在工作...");
}
}
@Service
public class WangwuWorkImpl implements WorkStrategy {
@Override
public void work() {
System.out.println("王五在工作...");
}
}
3. 策略Bean工厂(重点)
package com.itheima.strategy.newDemo.factory;
import cn.hutool.core.util.StrUtil;
import com.itheima.strategy.newDemo.service.WorkStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 工厂设计模式
*/
@Component
@RequiredArgsConstructor
public class StrategyBeanFactory {
/**
* 工作路由,根据名字获取对应的实现类名称
*/
private static final Map<String, String> workRoute = new HashMap<String, String>() {
{
put("zhangsan", "zhangsanWorkImpl");
put("lisi", "lisiWorkImpl");
put("wangwu", "wangwuWorkImpl");
}
};
/**
* 工作策略工厂
*/
@Autowired
private final Map<String, WorkStrategy> workStrategyMap = new ConcurrentHashMap<>();
/**
* 通过构造函数注入workStrategyMap
*
* @param workStrategyMap
*/
public StrategyBeanFactory(Map<String, WorkStrategy> workStrategyMap) {
this.workStrategyMap.putAll(workStrategyMap);
}
/**
* 根据名字获取对应的工作策略(获取对应的实现类)
*/
public WorkStrategy getWorkStrategy(String workerName) {
if (!workRoute.containsKey(workerName)) {
throw new RuntimeException("未配置工作路由" + workerName);
}
String implClazz = workRoute.get(workerName);
if (StrUtil.isEmpty(implClazz) || !workStrategyMap.containsKey(implClazz)) {
throw new RuntimeException("非法的工作类型");
}
return workStrategyMap.get(implClazz);
}
}