怎么实现策略模式+工厂模式
Java技术精选
共 3981字,需浏览 8分钟
·
2021-05-23 15:48
来源:cnblogs.com/huangqingshi/p/10344265.html
策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式?
具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELSE IF ELSE....。接下来咱们直接实现,项目结构图:
![](https://filescdn.proginn.com/b4a8c7488c90cbf75163e5f3221bcf1f/0bdf89ad8a932bd213fa2bd8b30fb918.webp)
工厂类FactoryStrategy负责创建策略的工厂,代码比较简单,比较关键的一点是AutoWired一个Map<String, Strategy>
这个会在初始化的时候将所有的Strategy自动加载到Map中,是不是很方便。使用concurrentHashMap是防止多线程操作的时候出现问题。同时还要注意@Service注解。
package com.hqs.pattern.factory;
import com.hqs.pattern.strategy.Strategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author huangqingshi
*/
@Service
public class FactoryForStrategy {
@Autowired
Map<String, Strategy> strategys = new ConcurrentHashMap<>(3);
public Strategy getStrategy(String component) throws Exception{
Strategy strategy = strategys.get(component);
if(strategy == null) {
throw new RuntimeException("no strategy defined");
}
return strategy;
}
}
接下来就是Strategy接口,就一个doOperation方法。
package com.hqs.pattern.strategy;
/**
* @author huangqingshi
*/
public interface Strategy {
String doOperation();
}
定义接口的实现,我定义了三个, 都类似,这里我就放出一个来吧。Component里边的one是指定其名字,这个会作为key放到Map strategys里边。
package com.hqs.pattern.strategy.impl;
import com.hqs.pattern.strategy.Strategy;
import org.springframework.stereotype.Component;
/**
* @author huangqingshi
*/
@Component("one")
public class StrategyOne implements Strategy {
@Override
public String doOperation() {
return "one";
}
}
好了,写一个Controller类,用于进行测试,当然我还是使用swagger,使用swagger的时候有个细节,就是注意生产上一定不能打开,否则是个非常可怕的事情。
package com.hqs.pattern.controller;
import com.hqs.pattern.factory.FactoryForStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author huangqingshi
*/
@Controller
public class StrategyController {
@Autowired
FactoryForStrategy factoryForStrategy;
@PostMapping("/strategy")
@ResponseBody
public String strategy(@RequestParam("key") String key) {
String result;
try {
result = factoryForStrategy.getStrategy(key).doOperation();
} catch (Exception e) {
result = e.getMessage();
}
return result;
}
}
打开swagger进行测试,输入one,返回one。输入four,返回no strategy defined。后续如果有新策略的话,直接实现即可。
![](https://filescdn.proginn.com/26d39d03a51ac23eb865d5f7837f694c/2ee707db7b48dfaedaadf7b5b1bb87ab.webp)
![](https://filescdn.proginn.com/79c525819a5cf72150d662b07530c978/95cda2e098a9429428c8c5de8a3fecea.webp)
好了,这块就这么完成了,你get到了吗?
代码地址:
https://github.co
评论