Springboot中实现策略模式+工厂模式的方法

网友投稿 547 2022-08-21


Springboot中实现策略模式+工厂模式的方法

策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式?

具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELSE IF ELSE....。接下来咱们直接实现,项目结构图:

工厂类FactoryStrategy负责创建策略的工厂,代码比较简单,比较关键的一点是AutoWired一个Map 这个会在初始化的时候将所有的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

* @Date 2019-01-31

*/

@Service

public class FactoryForStrategy {

@AutowirzvvHmed

Map 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

* @Date 2019-01-31

*/

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

* @Date 2019-01-31

*/

@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

* @Date 2019-01-31

*/

@Controller

public class StrategyController {

@Autowired

FactoryForStrategy factoryForStrategy;

@PostMapping("/strategy")

@ResponseBody

public String strategy(@RequestParam("key") String zvvHmkey) {

String result;

try {

result = factoryForStrategy.getStrategy(key).doOperatiohttp://n();

} catch (Exception e) {

result = e.getMessage();

}

return result;

}

}

打开swagger进行测试,输入one,返回one。输入four,返回no strategy defined。后续如果有新策略的话,直接实现即可。

好了,这块就这么完成了,你get到了吗?

代码地址:https://github.com/stonehqs/pattern.git


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mybatis中的多重if 条件判断
下一篇:使用Mybatis如何实现多个控制条件查询
相关文章

 发表评论

暂时没有评论,来抢沙发吧~