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

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

  工厂类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
* @Date 2019-01-31
*/
@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
* @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 key) {
String result;
try {
result = factoryForStrategy.getStrategy(key).doOperation();
} catch (Exception e) {
result = e.getMessage();
}
return result;
} }

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

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

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

  欢迎拍砖~

Springboot中实现策略模式+工厂模式的更多相关文章

  1. SpringBoot使用策略模式+工厂模式

    为了防止大量的if...else...或switch case代码的出现,可以使用策略模式+工厂模式进行优化. 在我的项目当中,报表繁多,所以尝试了这种方式进行优化报表的架构.代码很简单,如下: Fa ...

  2. 《设计模式面试小炒》策略和工厂模式替代业务场景中复杂的ifelse

    <设计模式面试小炒>策略和工厂模式替代业务场景中复杂的ifelse 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统, ...

  3. 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式

    1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...

  4. 从基础知识到重写Spring的Bean工厂中学习java的工厂模式

    1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式:  单例模式是指控制其他对象获 ...

  5. 设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)

    什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式.通过专门定义一个类来负责创建其它类的实例,被创建的实例 ...

  6. Spring中常见的设计模式——工厂模式

    一.简单工厂模式 简单工厂模式(Simple Factory Pattern)由一个工厂对象决定创建哪一种产品类的实例,简单工厂模式适用于工厂类负责创建对象较少的情况,且客户端只需要传入工厂类的参数, ...

  7. java模式-工厂模式

    今天在学习工厂模式,从最简单的简单工厂模式开始. 我们现在需要通过工厂Factory生产A,B两款产品(都是产品,实现了接口Product). 产品A: public class A implemen ...

  8. 简单工厂模式—>工厂模式

    一.功能 根据前一篇博客:策略模式+单例模式+简单工厂模式:推送服务,想试用一下工厂模式:将之前的简单工厂模式格式化为工厂模式. 二.实现 修改前:简单工厂 public static class P ...

  9. .Net简单工厂模式,工厂模式,抽象工厂模式实例

    1.定义   简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂模式:定义一个用于创建对象的接口, ...

随机推荐

  1. LaTeX 对齐问题

    一.一行文本对齐 \leftline{左对齐} \centerline{居中} \rightline{右对齐} 二.多行文本或段落对齐 左对齐 \begin{flushleft}...\end{flu ...

  2. np.savetxt()——将array保存到txt文件,并保持原格式

    问题:1.如何将array保存到txt文件中?2.如何将存到txt文件中的数据读出为ndarray类型? 需求:科学计算中,往往需要将运算结果(array类型)保存到本地,以便进行后续的数据分析. 解 ...

  3. SpringBoot扩展SpringMVC自动配置

    SpringBoot中自动配置了 ViewResolver(视图解析器) ContentNegotiatingViewResolver(组合所有的视图解析器) 自动配置了静态资源文件夹.静态首页.fa ...

  4. CSS如何进行图文并茂布局怎么破

    上下结构 左右结构 右边左边的结构

  5. ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Atomicity

    1.前言 Atomicity是内存访问的一个属性,描述为原子性访问,包括single-copy atomicity和multi-copy atomicity 2.基本概念 observer 可以发起对 ...

  6. 命令行command line 使用 http proxy的设置方法 Setting Up HTTP Proxy in Terminal

    Step 1: Install Shadowsocks Client Shadowsocks is an open-source proxy project to help people visit ...

  7. openssl版本升级操作记录【转】

    需要部署nginx的https环境,之前是yum安装的openssl,版本比较低,如下:   [root@nginx ~]# yum install -y pcre pcre-devel openss ...

  8. MFC 使用用指定USB设备串口

    在做设备串口通讯时,往往需要自动连接到想要连接的usb转串口设备上. #include <Setupapi.h> int CMFCApplication1Dlg::FindUSBCOM() ...

  9. c++ 简单静态链表

    所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表.对各结点既可以通过上一个结点的next指针去访问,也可以直接通过结构体变量名s1, s2, s3去访问 ...

  10. 使用NGINX+Openresty和unixhot_waf开源防火墙实现WAF功能

    使用NGINX+Openresty实现WAF功能 一.了解WAF1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 .英文:Web Application Firewall,简称: ...