23种设计模式之策略模式(springboot中应用)

接到一个任务,需求是用策略模式,编写保存接口。
该接口是在springboot上进行开发,我的设想就是该接口接收json数据,其中有表名字段,通过表名来选择不同的策略。后期如果有不同的开发者需要不同的保存策略(往不同的表上保存数据),则只需要写一个实现基础策略的类然后自定义自己的需求即可。(下图框框内的三个类)
在这里插入图片描述
其中的返回格式ResponseResult自定义,不需要和我一样。AddService将所有实现了基础策略接口的类都注入Map容器中,并提供根据表名到map中获取策略的方法getResource()。

 
@RestController
@RequestMapping("/erpAdd")
public class AddController {
    @Autowired
    private AddService addService;

    @RequestMapping("/add")
    public ResponseResult add(@RequestBody String parJson){
        ResponseResult res = new ResponseResult();

        JSONObject data = JSONObject.parseObject(parJson); 
        String dbName = data.getString("dbName");
        JSONObject parJson1 = data.getJSONObject("parJson"); 
        if(parJson.isEmpty()||dbName.isEmpty()){//参数校验
            res.setData("");
            res.setErrcode(1);
            res.setErrmsg("参数不能为空!");
            return res;
        } 
        dbName = dbName.toLowerCase();
        try {
            addService.getResource(dbName,parJson1);
            res.setData("");
            res.setErrcode(0);
            res.setErrmsg("保存成功!");
        }catch (Exception e){

            res.setData("");
            res.setErrcode(1);
            res.setErrmsg("保存失败!");
        }

        return res;
    }
}


/**
 * 上下文Context,将所有的策略类都注入到map中,
 */
@Service
public class AddService { 
    //使用线程安全的ConcurrentHashMap 公共接口
    private final Map<String, AddStrategy > strategyMap = new ConcurrentHashMap<>();
    //Autowired注解会自动将实现策略接口的 实现类注入到Map中,key就是自定义的Bean的名称,对应的是表名
    //spring容器会在类加载后自动注入这个方法的参数,并执行一遍方法。
    @Autowired
    public AddService(Map<String, AddStrategy > strategyMap){
        this.strategyMap.clear();
        strategyMap.forEach((k,v)-> this.strategyMap.put(k,v));//将所有的策略暴露出来
        //将key(即具体策略类中的component的名称)与具体策略类put到map中
    }
    public void getResource(String dbName, JSONObject parJson) throws Exception {
        strategyMap.get(dbName).add(parJson);
        //在map中根据表名找的对应的容器
    }
}

@Autowired作用在方法上,会在spring初始化后执行一次。lambda表达式中的 k 就是以下"具体策略类" @Component(“wdddb”) 中定义的名称。v 就是具体的策略类。


/**
 * 策略接口
 */
public interface AddStrategy {
    public void add(JSONObject parJson) throws Exception;
}

在这里插入代码片
/**
 * 具体策略类
 *
 */
@Component("wdddb")//注入spring中,容器统一管理,直接用表名做容器的名称,通过不同的表名调用具体的策略
public class WdddStrategy implements AddStrategy {
    @Autowired
    AddMapper addMapper;
    @Override
    @Transactional(timeout = 25, propagation = Propagation.REQUIRED)
    public void add(JSONObject parJson) throws Exception {

        String buyerNick = parJson.getString("buyer_nick");
        String title = parJson.getString("title");
        String type = parJson.getString("type"); 
        if("".equals(buyerNick)||"".equals(title)||"".equals(type)){//parJson必填字段校验
            throw new Exception();//有空字段,则抛给上一个
        }
        Wdddb wdddb = new Wdddb();
        wdddb.setBuyer_nick(buyerNick);
        wdddb.setTitle(title);
        wdddb.setType(type);
        addMapper.addWddd(wdddb);
    }
}
@Mapper
public interface AddMapper {
     void addWddd(@Param("wdddb")Wdddb wdddb);

    void addWdddmx(@Param("wdddmxb")Wdddmxb wdddmxb);
}

AddMapper.xml就不赘述了。其他的具体策略类也不写了。

参考:策略设计模式
示例代码
在这里插入图片描述
参考中的示例是要用new来实例化的,但是spring的IOC已经将对象的创建交给容器负责了,再使用老方法就是回去了。所以在AddService中把具体策略类的创建交给容器去创建,解耦,易扩展。但是也有缺点,就是需要把所有的具体策略都暴露出来。在小项目中用更加繁琐,只有在大项目多人协助开发的情况下,优点才有所体现。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大数据和算法、数据分析的应用场景非常广泛,可以涵盖各个行业和领域。以下是一些常见的大数据和算法、数据分析应用场景: 电子商务:通过收集用户消费习惯、季节和产品生命周期的数据,建立算法模型来确定下一个月、几个月甚至一年的消费者需求。这样可以提高订单转化率。在营销方面,可以给买家贴标签,建立人群画像,针对不同人群精准投放广告和优惠券。 医疗保健:医生根据患者的症状和检查结果,结合自身经验得出结论,最终提供相应的治疗方案。不同地区的医疗水平各不相同,尤其是高水平医生短缺,好医院分布不均。根据患者的症状检测报告,通过病理分析模型确定病因,并提供具体的治疗方案。即使在医疗保健不发达的地区,也只需要输入患者的症状和医疗记录,就可以体验高级医生的服务。 金融风险管理:金融机构利用大数据技术来分析交易数据、市场趋势和经济指标,识别潜在的风险和欺诈行为。大数据技术还可以用于建立预测模型,帮助金融机构预测市场变化,制定有效的风险管理策略。 物流和供应链管理:大数据技术可以优化物流运输路线、库存管理和供应链协调。通过分析大量的实时物流数据和市场需求数据,企业可以提高配送效率,减少成本,并提供更好的客户服务。 智能城市和交通管理:大数据技术可以帮助城市管理者监测和分析交通流量、能源消耗和环境污染等数据,为城市规划和交通管理提供决策支持。通过智能化的交通系统和城市基础设施,可以提高交通效率
飘香水果购物网站设计与实现资源介绍 “飘香水果购物网站设计与实现”是一个基于Spring Boot框架的Java毕业设计项目,该项目致力于构建一个功能齐全、用户体验良好的在线水果购物平台。通过此项目,学生不仅能够深入理解Spring Boot框架的核心技术,还能将理论知识与实际应用相结合,提升编程实践能力。 该项目涵盖了前后端分离的开发模式,前端采用响应式设计,使得网站能够在不同设备上呈现出良好的视觉效果;后端则基于Spring Boot框架,实现了用户管理、商品展示、购物车管理、订单处理等一系列核心功能。同时,项目还整合了支付接口和物流查询功能,为用户提供了便捷的购物体验。 在数据库设计方面,项目采用了关系型数据库MySQL,通过合理的表结构设计和索引优化,确保了数据的完整性和查询效率。此外,项目还考虑了数据的安全性和备份策略,为网站的稳定运行提供了保障。 值得一提的是,该项目不仅是一个完整的毕业设计作品,更是一个可二次开发定制的平台。源代码清晰规范,注释详尽,方便其他开发者在此基础上进行功能扩展或优化。无论是想要学习Spring Boot开发技术的新手,还是希望快速搭建一个在线购物网站的开发者,这个项目都能提供宝贵的参考和借鉴价值。 总之,“飘香水果购物网站设计与实现”是一个集学习、实践、开发于一体的优质资源,对于提升Java开发能力和项目实战经验具有重要意义。
资源介绍 “基于Spring Boot开发的医院固定资产系统”是一项精心设计的Java毕业设计项目,旨在为现代医院提供一个全面、高效的固定资产管理平台。该项目充分利用了Spring Boot框架的便捷性和灵活性,结合医院固定资产管理的实际需求,打造了一个功能完善、操作简便的应用系统。 该系统涵盖了固定资产的入库、出库、盘点、折旧计算、维修维护等核心业务流程,通过简洁直观的用户界面,使得医院管理人员能够轻松实现对固定资产的全方位监控。同时,系统还提供了数据统计分析功能,有助于医院管理层更加科学、合理地制定资产管理策略。 在技术上,该系统采用了前后端分离的开发模式,前端使用流行的前端框架进行开发,后端则基于Spring Boot构建RESTful API,实现了前后端数据的高效交互。数据库方面,系统采用了关系型数据库进行数据存储,保证了数据的稳定性和安全性。 值得一提的是,该项目附带了详细的源代码和说明文档,使得学习者可以轻松地理解系统的实现原理和技术细节。此外,该系统具有良好的可扩展性和可定制性,用户可以根据自身的业务需求进行二次开发,进一步丰富和完善系统的功能。 总之,“基于Spring Boot开发的医院固定资产系统”不仅是一个功能强大的资产管理工具,更是一个优秀的Java毕业设计项目范例。它不仅能够满足医院的实际需求,还能够为学习者提供宝贵的学习和实践机会,帮助他们更好地掌握Java Web开发的相关知识和技能。
SpringBoot项目基于springboot的智能家居系统是一个为现代家庭设计的自动化解决方案。它利用Spring Boot的快速开发特性,结合了设备管理、远程控制、情景模式设定、能源监控、安全监控以及数据分析等功能,旨在提供一个集化、智能化和高效能的工具,以改善用户的居家体验并提高生活质量。 以下是该智能家居系统的主要功能: 1. **智能设备集成**:支持与各种智能设备如灯光、温控器、安全摄像头等进行连接和通信。 2. **远程控制接口**:用户可以通过手机应用或网页端远程操控家的智能设备。 3. **自动化场景设置**:用户可以设定不同的情景模式,如离家模式、归家模式、睡眠模式等,实现设备的自动操作。 4. **能源消耗分析**:监控家庭能源使用情况,提供节能建议和报告。 5. **实时安全监控**:集成安全监控系统,对家异常活动进行实时警报和通知。 6. **移动设备优先设计**:采用响应式布局,使平台在不同大小的屏幕上均有良好展现,尤其适应移动设备。 7. **数据安全与隐私保护**:采取加密技术和访问控制策略,确保用户数据的安全性和隐私性。 8. **友好的用户操作界面**:界面直观易用,降低用户学习成本,并提供多语言支持。 9. **易于维护和扩展**:前后端分离架构和模块化设计,方便未来根据智能家居行业的技术进步进行系统升级或功能拓展。 10. **智能推荐算法**:根据用户行为和偏好,智能推荐合适的设备设置和节能措施。 通过这些功能,基于Spring Boot的智能家居系统不仅提高了家庭的便捷性和安全性,还提升了能源效率和生活舒适度。系统的架构设计注重性能、可用性和可维护性,以支持高并发的设备控制和数据处理。其模块化的设计也便于未来根据智能家居技术的新发展增加新功能或升级现有功能,确保软件的长期适用性和技术前瞻性。
生鲜交易系统是一个基于Spring Boot框架的Web应用,它专为生鲜产品供应链的生产者、分销商和零售商设计。该系统的目标是简化生鲜商品的买卖流程,确保食品的新鲜度和质量,同时提高整个供应链的效率。 系统的主要功能包括: 1. 商品管理:允许用户列出待售的生鲜商品,包括详细的描述、价格、库存量等信息。 2. 订单处理:系统支持从下单到配送的全过程管理,包括订单跟踪和状态更新。 3. 实时库存同步:通过自动化系统确保库存数据在各销售点的实时同步。 4. 支付集成:整合多种支付方式,提供安全便捷的在线支付解决方案。 5. 数据分析与报告:生成销售和供应链的详细报告,帮助商家优化库存管理和市场策略。 6. 用户账户与权限:不同角色的用户(如供应商、分销商、买家)能够访问对应的数据和功能。 7. 移动设备兼容性:支持移动设备访问,方便用户随时随地管理订单和库存。 8. 质量保证与追溯:记录每批生鲜产品的来源和检验信息,以确保食品安全。 本系统采用前后端分离的开发模式,前端可能使用React、Angular或Vue.js等现代JavaScript框架来构建用户界面,后端则利用Spring Boot提供的快速开发能力实现RESTful API接口。数据库通常选用MySQL或其他关系型数据库来存储商品信息、订单详情和用户资料等数据。 Spring Boot的使用使得项目具有快速搭建和易于部署维护的特点,同时Spring Boot生态系统丰富的插件和组件支持了系统的快速开发和扩展。系统还考虑到了易用性和无障碍访问,使得不同水平的用户都能轻松上手。 总体而言,基于Spring Boot的生鲜交易系统提供了一个全面、高效、互动的商务环境,极大地促进了食品行业的现代化和信息化,是现代电子商务技术的重要组成部分。
Spring Boot并没有特定的设计模式,它是基于Spring框架的快速开发工具。然而,Spring框架本身使用了多种设计模式来实现其功能。其一些常见的设计模式包括: 1. 工厂模式(Factory Pattern):Spring使用工厂模式来创建和管理Bean实例。通过配置文件或注解,Spring可以根据需要动态地创建和配置Bean。 2. 单例模式(Singleton Pattern):Spring默认将Bean定义为单例,即在整个应用程序只创建一个实例。这样可以提高性能并确保Bean的一致性。 3. 模板模式(Template Pattern):Spring的JdbcTemplate是一个典型的模板模式的应用。它提供了一种简化数据库操作的方式,将常见的操作封装在模板开发人员只需要关注业务逻辑。 4. 策略模式(Strategy Pattern):Spring在加载Bean定义信息时,可以根据不同的来源(如XML、注解、Properties等)使用不同的策略来解析。这种灵活的方式正是策略模式应用。 5. 装饰器模式(Decorator Pattern):Spring的AOP(面向切面编程)功能使用了装饰器模式。通过在原有的业务逻辑上添加额外的功能,实现了横切关注点的分离。 6. 观察者模式(Observer Pattern):Spring的事件机制使用了观察者模式。通过定义事件和监听器,可以实现组件之间的解耦和通信。 7. 代理模式(Proxy Pattern):Spring的AOP功能也使用了代理模式。通过动态代理,可以在目标对象的方法执行前后添加额外的逻辑。 8. 适配器模式(Adapter Pattern)与责任链模式(Chain of Responsibility Pattern):这两种设计模式Spring并没有直接的应用,但是Spring的整体架构和设计理念可以看作是一种适配器模式和责任链模式的应用,通过各种组件的协作来实现灵活、可扩展的应用开发。 综上所述,Spring框架在实现功能时使用了多种设计模式,这些设计模式开发人员提供了灵活、可扩展的开发方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值