当前位置: 首页 > 科技观察

聊天中生成的文件太多,怎么办?

时间:2023-03-20 19:15:24 科技观察

前言最近工作需要保存企业微信聊天记录。我遇到了一些问题。数据量太大。我应该如何保存它?存储后,需要将其取回。怎样才能快速找回?聊天中生成的文件太多,如何去重?一言以蔽之,但对开发者来说很难。以后有空我会指出,北军会整理这个功能的问题和解决办法。今天,我将分析其中一个问题,并使用策略模式来解决问题。对策略模式不了解或者时间久了忘记了策略模式。小伙伴们,我们先简单了解一下策略模式。官方的话什么是策略模式:策略模式(StrategyPattern):定义一系列算法类,封装每一个算法,让它们相互替换。策略模式允许算法独立于使用它的客户而改变。简单理解就是针对不同的场景使用不同的策略。优势算法可以自由切换。避免使用多个条件判断。良好的可扩展性。缺点策略类会增加。所有策略类都需要对外暴露。使用场景如果一个系统中有很多类,它们之间的区别只是它们的行为,那么使用策略模式可以动态地让一个对象在众多行为中选择一个行为。系统需要动态地选择几种算法中的一种。如果一个对象有很多行为,如果不使用适当的模式,则必须使用多个条件选择语句来实现这些行为。StructuralDiagramStrategyPatternStructuralDiagramStrategyPattern一个简单的示例场景:最近太热了,想降温怎么办?首先,为冷却策略定义一个接口。publicinterfaceCoolingStrategy{/***处理方法*/voidhandle();}定义3个冷却策略;实现策略接口;publicclassIceCoolingStrategyimplementsCoolingStrategy{@Overridepublicvoidhandle(){System.out.println("使用}}publicclassFanCoolingStrategyimplementsCoolingStrategy{@Overridepublicvoidhandle(){System.out.println("使用风扇降温");}}publicclassAirConditionerCoolingStrategyimplementsCoolingStrategy{@Overridepublicvoidhandle(){System.out.println("Usetheairconditionertocooldown");}}定义冷却策略的上下文;publicclassCoolingStrategyContext{privatefinalCoolingStrategy策略;publicCoolingStrategyContext(CoolingStrategy策略){this.strategy=strategy;}publicvoidcoolingHandle(){strategy.handle();}}test;publicclassMain{publicstaticvoidmain(String[]args){CoolingStrategyContextcontext=newCoolingStrategyContext(newFanCoolingStrategy());context.coolingHandle();context=newCoolingStrategyContext(newAirConditionerCoolingStrategy());context.coolingHandle();context=newCoolingStrategyContext(newIceCoolingStrategy());context.coolingHandle();要降温,请使用冰块降温。以上是策略模式的简单实现。策略模式的项目实战场景以我在工作中遇到的场景为例。《企业微信会话存档》功能可以获取各种格式的消息内容,分析并保存数据。这里只针对消息处理的功能模块,其他功能关于《企业微信会话存档》,大家有时间整理一下发出来。企业微信对话聊天会产生如下信息。SpringBoot项目中如何使用策略模式完成消息解析?企业微信消息格式获取会话内容-API查看API内容,数据为json格式。想想怎么处理:首先,由于需要解析各种数据,而且每种数据格式结构都不一样,所以需要根据每种消息格式定义每个对象,然后根据需要将json格式处理成pojo不同的需求对象;根据场景需要定义两个策略接口,一个是普通文本格式消息的策略,一个是需要处理文件格式消息的策略;定义策略处理上下文操作类,用于使用策略;每条消息,都会有一些相同的数据,比如发送者、接收者、消息类型等;根据不同的消息类型,使用key-value的方式让调用者决定应该使用哪种策略来处理数据;由于格式太多,这里仅以两种格式为例;实现两个策略接口;publicinterfaceStrategy{/***处理会话存档的内容**@paramcontentjson格式消息内容*@returnresult*/ThandleContent(Stringcontent);}publicinterfaceMediaStrategy{/***Handlesessionarchivemediacontent**@parammsgData消息内容*/voidhandleMedia(TmsgData);}策略的具体实现(伪代码);@Component("link")publicclassLinkStrategyimplementsStrategy{@OverridepublicLinkPOhandleContent(Stringcontent){//将JSON转换为具体对象LinkWrapDTOlinkWrapDTO=JacksonUtils.json2Obj(content,LinkWrapDTO.class);//将对象处理成业务需要的格式returnConvert.convert(LinkPO.class,linkWrapDTO);}}@Component("image")公共类ImageStrategy实现Strategy,MediaStrategy{@AutowiredprivateIMsgFileServicemsgFileService;@OverridepublicImagePOhandleContent(Stringcontent){//将JSON转换为具体对象ImageWrapDTOimageWrapDTO=JacksonUtils.json2Obj(content,ImageWrapDTO.class);//将对象处理成业务需要的格式returnConvert.convert(ImagePO.class,imageWrapDTO);}@OverridepublicvoidhandleMedia(TmsgData){//将数据格式转换为具体的数据格式ImagePOimagePo=Convert.convert(ImagePO.class,msgData);//调用文件服务进一步处理文件getImage().getFilesize(),imagePo.getImage().getMd5sum(),MessageEnum.IMAGE);}}策略上下文;@ComponentpublicclassStrategyContext{@ResourceMapstrategies=newConcurrentHashMap<>();@ResourceMapmediaStrategys=newConcurrentHashMap<>();publicStrategygetStrategy(Stringcomponent){returnstrategies.get(component);}publicMediaStrategygetMediaStrategy(Stringcomponent){returnmediaStrategys.get(component););公共类MsgService{@ResourceprivateStrategyContextstrategyContext;publicvoidhandlerMessage(){//请求api获取消息的jsonjson=api();//转换为通用格式对象basePo=JsonUtils.json2Obj(json,BasePO.class);//选择不同的策略Strategystrategy=strategyContext.getStrategy(basePo.getMsgType());//处理策略.handleContent(json);//关于文件类型消息的处理MediaStrategymediaStrategy=strategyContext.getMediaStrategy(basePo.getMsgtype());if(null!=mediaStrategy){mediaStrategy.handleMedia(basePo);}}}以上是策略模式的一个实现;使用策略模式处理不同格式的消息,虽然策略类多了很多,但是让整个功能模块的代码变得清晰,松耦合,易于扩展修改,不影响其他流程小结从上面的例子可以看出策略模式的灵活性;如果此时企业微信提供了新的消息格式,那么完全不需要修改之前的代码,只需要写一个新的类来实现消息处理策略的接口重写处理方法即可;了解策略模式的优缺点,合理使用策略模式,会让你的代码更加整洁优雅。