当前位置: 首页 > wzjs >正文

无锡哪里做网站设计之家logo设计

无锡哪里做网站,设计之家logo设计,宁波网络营销推广制作,东莞阳光网站建设成效需求分析 公司做物联网系统的,使用nettry进行设备连接,对设备进行数据采集,根据设备的协议对数据进行解析,解析完成之后存放数据库,但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…

需求分析

公司做物联网系统的,使用nettry进行设备连接,对设备进行数据采集,根据设备的协议对数据进行解析,解析完成之后存放数据库,但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类,所有的协议解析都在同一个方法类里面了,耦合度超高,不够优雅,我决定使用策略模式对它进行优化!

策略模式

下面是原理图,跟其他大佬的差不多,主要就是抽象策略接口具体策略环境三部分,这里不介绍策略模式了,建议去看看别的大佬写的好博客吧。
在这里插入图片描述

下面直接上代码!

代码实现

枚举类

现有的系统是根据协议长度来判断不同厂家的设备的,所以定义一个枚举类,len是协议的长度,beanName是具体策略的bean名称,通过传入的协议长度获取beanName,再获取具体策略的bean,去执行具体的解析方法。

public enum AnalysisEnum {SONGXIA(101, "songXiaAnalysisStrategy", "松下"),OTC(102, "OTCAnalysisStrategy", "OTC"),JIANGNAN(103, "jiangNanAnalysisStrategy", "江南"),;private int len;private String beanName;private String desc;AnalysisEnum(int len, String beanName, String desc) {this.len = len;this.beanName = beanName;this.desc = desc;}public int getLen() {return len;}public String getBeanName() {return beanName;}public String getDesc() {return desc;}public static AnalysisEnum getAnalysisEnum(Integer len) {for (AnalysisEnum analysisEnum : AnalysisEnum.values()) {if (analysisEnum.getLen() == len) {return analysisEnum;}}throw new RuntimeException("异常");}
}

抽象策略接口和具体策略

public interface AnalysisStrategy {void analysis();
}@Component("jiangNanAnalysisStrategy")
public class JiangNanAnalysisStrategy implements AnalysisStrategy {@Overridepublic void analysis() {System.out.println("解析江南协议...");}
}@Component("OTCAnalysisStrategy")
public class OTCAnalysisStrategy implements AnalysisStrategy {@Overridepublic void analysis() {System.out.println("解析OTC协议...");}
}@Component("songXiaAnalysisStrategy")
public class SongXiaAnalysisStrategy implements AnalysisStrategy {@Overridepublic void analysis() {System.out.println("解析松下协议...");}
}

环境

抽象策略接口定义为Map<String, AnalysisStrategy>的value,通过spring的自动注入,所有的具体策略实现类都会被注入到map当中,key为beanId,即@Component指定的bean名称,配合AnalysisEnum,就可以通过协议长度获取具体策略执行具体方法,从而优雅地消除if-else

@Component
public class AnalysisContext {@Resourceprivate Map<String, AnalysisStrategy> selectorMap;public void analysis(Integer len) {AnalysisEnum analysisEnum = AnalysisEnum.getAnalysisEnum(len);System.out.println("协议长度:" + len + " " + "设备:" + analysisEnum.getDesc());selectorMap.get(analysisEnum.getBeanName()).analysis();}
}

controller

@RestController
@Api(tags = "策略模式")
public class StrategyController {@Autowiredprivate AnalysisContext analysisContext;@GetMapping("/strategy")@ApiOperation("策略模式测试接口")public void test1(@RequestParam Integer len) {analysisContext.analysis(len);}
}

测试结果

在这里插入图片描述

总结

最优雅地策略模式,当然是实现了抽象策略接口之后就可以使用,但是目前本帅写的代码当中尽管优雅地消除了if-else,但不符合OOP原则,不过没办法,系统中就必须得通过协议长度去判断不同的协议,而spring中注入具体策略类是通过beanId去实现的,无法通过协议长度直接拿到具体策略类。有一个好的方法就是通过配置文件或者数据库去配置协议长度和beanId的关系,这样子以后再有扩展不同厂家的协议之后就可以不需求改动源代码,而只需要在配置文件或数据库中添加协议长度和beanId的映射关系即可

http://www.dtcms.com/wzjs/544008.html

相关文章:

  • 门业网站模板设计需要了解的网站
  • 电商网站开发目的wordpress excel导入
  • 兰州做网站或小程序湖南长沙招聘信息最新招聘2022
  • 青岛建站模板厂家商派商城网站建设
  • 衡阳市建设学校官方网站国内免备案网站空间
  • 企业网站架构公司注册资金减少意味着什么
  • 国内做网站的公司湖南建筑信息网湖南建设人力资源
  • 旅游网站建设流程步骤求一个2023年没封的
  • 网站建设公司的公众号南通的网站建设
  • 宇宙企画网站阿里云wordpress菜鸟
  • 有哪些做软件的网站有哪些如何制作apple pencil
  • 网页设计师联盟网站怎么小语种网站怎么做
  • 网站建设主要工作流程wordpress 天气插件
  • 天津电商网站制作阿里云免费域名注册
  • 网站建设用的是什么软件在货源网站自己拿样 加盟 做代理 哪个比较好?
  • 嘉兴自助模板建站怎么看网站空间
  • 嵩明县住房和城乡建设局网站检测站点是否使用wordpress
  • 大连专业手机自适应网站建设维护metro 网站模板
  • 学校网站建设注意点长沙住房与城乡建设部网站
  • 有免费建网站cvm服务器
  • 建设一个网站大概费用sem跟seo的区别
  • 做一个小程序商城需要多少钱石家庄seo优化
  • 富阳做网站成都网页设计班
  • 网站备案没座机营销推广软文案例
  • 如何查看网站建站程序网站软件有哪些
  • 商城网站开发技术地方门户系统源码
  • 广州服装 网站建设做软欧的网站
  • 天津网站开发制作重庆网站建设多少钱
  • 株洲企业网站建设工作场外期权网站开发
  • 专业微网站制作做摄影网站