专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

策略模式在业务中的实际应用

  策略模式结构图
  策略模式主要由以上三个身份组成,这里我们就不过多介绍策略模式的基础知识,默认大家已经对策略模式已经有了一个基础的认识。业务需求
  现有一个广告点击数据埋点上报的需求,上报的埋点数据根据点击的广告位置不同做区分进行上报,每个广告位置的数据进行分表存储。(eg:这里大家也不必深究分表存储为什么要这么做,我们只聊策略模式的实际应用)代码实现
  由于是实战案例,那么我们是基于SpringBoot框架的,主要要使用的Spring的一些功能,所以大家要注意。第一步:定义策略类
  首先我们定义一个上报的接口publicinterfaceAdvertisingDataReported{StringadvertisingDataReported(Objectparam);}第二步:定义具体的策略实现类ServicepublicclassBottomAdvertisingDataReportedimplementsAdvertisingDataReported{OverridepublicStringadvertisingDataReported(Objectparam){具体的业务逻辑略returnnull;}}第三步:策略控制类
  由于策略模式有好多具体的具体策略实现,那么到底使用哪一个策略需要根据我们的入参,也就是我们业务中的广告类型进行判断,那么我们该如何优雅的进行判断呢?
  我们先看看这种方式publicstaticvoidmain(String〔〕args){StringadvertisingType1;if(advertisingType。equals(1)){执行策略A}elseif(advertisingType。equals(2)){执行策略2}}
  这么写的大有人在,我们这里也不讨论这些问题。我们先看一下这么写存在哪些问题?
  存在的问题:1。违反开闭原则,每次增加新的策略实现类,都要加一个if判断;2。随着策略实现类的增加,代码变的臃肿,越来越难以维护;
  基于这种情况,我们可不可以在项目启动的时候,将所有的策略实现类进行初始化,存储在Map当中,广告类型作为key,实现类作为Value,我们看如下代码:ComponentpublicclassStrategyFactoryimplementsApplicationContextAware{privatefinalMapString,AdvertisingDataReportedSTRATEGYMAPnewConcurrentHashMap();OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{返回该接口所有的实现类MapString,AdvertisingDataReportedtempMapapplicationContext。getBeansOfType(AdvertisingDataReported。class);tempMap。values()。forEach(strategyServiceSTRATEGYMAP。put(strategyService。getClass()。getName(),strategyService));}publicTextendsAdvertisingDataReportedAdvertisingDataReportedgetInstance(ClassTclazz){returnSTRATEGYMAP。get(clazz。getName());}}
  我们的策略控制类实现了ApplicationContextAware,这个类你可以这么理解,它可以获得ApplicationContext的上下文,由于我们是至于SpringBoot讲这个案例的,我们的策略类实现类都加了Service注解注入到了Spring容器中,所以我们可以直接从容器中,取到策略类的所有实现类。
  获取到所有的策略实现类之后,我们把类路径作为key,类的实现作为value存储到了map中,到此我当时觉得就大功告成了。
  大家觉得还存在什么问题?
  我们怎么知道这个入参需要走哪个具体的策略类呢?还需要定义一个单独的类,来对广告类型和策略类进行映射,那这跟判断不又是同一个逻辑的吗?还得一直维护这个映射关系。改造
  如果不想单独的定义一个类对广告类型和策略类进行一一映射,那么我们可不可以在策略类中进行解决,每个策略类实现类知道它要处理哪种类型,这样我们就可以把map中Key类路径的值替换为广告类型,这样就可以根据上报接口入参的广告类型,直接从Map中进行get。
  具体的实现有两种,你可以自定义注解,通过加注解的方式进行区分,也可以使用方法,那么我们这里直接使用方法进行处理。
  改造后的代码:
  策略类:publicinterfaceAdvertisingDataReported{新增方法AdvertisingTypeEnumadvertisingType();StringadvertisingDataReported(Objectparam);}
  策略实现类:ServicepublicclassBottomAdvertisingDataReportedimplementsAdvertisingDataReported{OverridepublicAdvertisingTypeEnumadvertisingType(){returnAdvertisingTypeEnum。BOTTOM;}OverridepublicStringadvertisingDataReported(Objectparam){returnnull;}}
  策略控制类:ComponentpublicclassStrategyFactoryimplementsApplicationContextAware{Map的Key改为广告类型枚举类privatefinalMapSTRATEGYMAPnewConcurrentHashMap();OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{MapString,AdvertisingDataReportedtempMapapplicationContext。getBeansOfType(AdvertisingDataReported。class);tempMap。values()。forEach(strategyServiceSTRATEGYMAP。put(strategyService。advertisingType(),strategyService));}根据广告类型获取相应的策略类publicTextendsAdvertisingDataReportedAdvertisingDataReportedgetInstance(AdvertisingTypeEnumadvertisingTypeEnum){returnSTRATEGYMAP。get(advertisingTypeEnum);}}
  广告枚举类:publicenumAdvertisingTypeEnum{BOTTOM,TOP;privateStringadvertisingType;AdvertisingTypeEnum(){}setget省略}策略类的具体使用RestControllerpublicclassAdvertisingDataReportedController{ResourceprivateStrategyFactorystrategyFactory;RequestMapping(valuereporteddata,methodRequestMethod。POST)publicStringreportedData(AdvertisingTypeEnumadvertisingTypeEnum,Objectobj){AdvertisingDataReporteddataReportedstrategyFactory。getInstance(advertisingTypeEnum);StringresultdataReported。advertisingDataReported(obj);returnSUCCESS;}}小小总结:
  到这里我们这个策略模式的案例就算结束了,有几个问题不知道大家有没有疑惑,为什么我要用Object作为方法的入参,我们这种案例中,好像每个策略类的入参好像都是一样的,但是也有可能出现同一个策略的实现类,但是入参完全可能不相同,那么这个时候,我们就可以通过传入Object的方式,在方法内部进行转换,当然了,如果这样你嫌策略方法太死板了,那么你也可以在方法上加入泛型,具体转换为什么类型,通过调用者传入泛型来转换。
  经过这样一番改造之后,刚才我们遇到的两个问题也都统统不是问题了,我们想要新增一个策略实现类,只需要实现定义的策略类即可,无需增加额外的任何代码。

世界杯上欧美球队沸沸扬扬支持的LGBT到底是个啥?这届卡塔尔世界杯可谓精彩纷呈惊喜不断。主办方不惜重金力求完美,甚至球场街道都给装上了露天空调,尽显土豪本色。而先是沙特胜了阿根廷,后是日本胜了德国,也给球迷们带来了足够的惊喜与刺激2022年世界技能大赛特别赛奥地利赛区比赛开幕2022年世界技能大赛特别赛奥地利赛区比赛开幕新华网11月24日,来自上海第二工业大学的朱珂在奥地利萨尔茨堡参加2022年世界技能大赛特别赛奥地利赛区货运代理项目比赛。11月24日母其弥雅气场真强大,穿不对称礼服超霸气,不愧是成龙女徒弟头条创作挑战赛女人的美丽,总是不拘一格的。小鸟依然是美,霸气张扬也是美。不同的穿搭,展现着不一样的风格。想要高级强大的气场,就必然需要选择霸气又华贵的服装。母其弥雅不仅是瑜伽教母,浪漫而革命的法国人每每想到法国,想到巴黎,头脑都是乱糟糟的,因为关于巴黎,关于法国的元素实在太多了,而且这些都是著名的元素,悠久的元素,有些还是引领世界变化的元素。有一次站在埃菲尔铁塔之上,俯视整个银屑病护理的润肤剂使用攻略银屑病是免疫介导的慢性复发性炎症性皮肤病,典型皮损临床表现为鳞屑性红斑或斑块,局限或广泛分布。医学上普遍认为银屑病是多基因遗传,受到外界的感染环境精神刺激药物及内分泌和免疫功能失去卡塔尔告诉我们,世界杯没有内幕2022年卡塔尔世界杯揭幕战,卡塔尔02不敌厄瓜多尔,成为世界杯历史上首支揭幕战输球的东道主。热搜词条原来有钱人也有不快乐的时候卡塔尔世界杯东道主输球后,现场球迷满脸抑郁,虽然卡塔马拉多纳丑闻不断,为何球迷始终爱他敬重他,死后还享受国葬头条创作挑战赛2020年11月25日,迭戈马拉多纳因心梗去世。他去世后,阿根廷政府发布公告称全国进入为期三天的哀悼期,各地降半旗致哀。因为一个运动员的去世,阿根廷政府这样大张旗鼓,生活冷知识生活小知识1。饭后不要立即吃水果。食物吃到肚子到消化要2个小时左右,如果饭后立即吃水果可能会停留在你的胃里,然后发酵,引起胃胀。吃水果宜选在饭前一小时或者是饭后两小时为最佳。2。吃抄书第13天,人为什么会生病今天重新又翻开曲教授的这本从头到脚说健康,这是我特别喜欢的一本书,看了很多遍,也学了很多养生知识,想分享给大家。摘抄了首页的人为什么会生病?她讲有三种原因的病因,不知道大家有没有?你割完双眼皮后悔了吗?主观判断每个人做完的效果也是不同的。先来说说为什么会在做完双眼皮之后出现后悔一眼部做完之后有肉条感,就是网络俗称的悲伤蛙。二眼部做完之后瘢痕感明显。这是我之前修复过的一个患者,来找最强还是嘴强?星越LHiP即将上市,能说的都在这里如果能有一辆没有里程焦虑的电动汽车就好了。我想对于很多新能源汽车车主或者准备购买新能源汽车的用户来说,这是大家共同的愿望。吉利针对这一需求亮出了新招,推出星越LHiP这款车,其定位
爱奇艺不再限制投屏,谁能管管优酷的投屏问题爱奇艺已经就投屏问题给观众们一个满意的答复!投屏不再限制清晰度,另外也不局限于一个客户端播放。这一做法可以说既合情合理,又体现了人性化。更充分显示了爱奇艺的诚意和格局。接下来呢,我一篇文章让您成为辨别音响好坏的高手随着音乐电影和游戏的普及,越来越多的人开始关注音响品质。但是,对于大多数人来说,如何判断音响的好坏却并不容易。在这篇文章中,我将为您介绍一些辨别音响好坏的方法,帮助您成为一名合格的托拜亚斯哈里斯我支持恩比德拿MVP博班是我遇到过的最好的人直播吧2月22日讯76人球员托拜亚斯哈里斯近期参与节目时表示,他支持队友恩比德赢得本赛季的MVP。你们知道的,我会站在恩比德这边。他整个赛季都很有统治力。我们队也打得很好。我们还有反腐败斗争一刻不能停,必须永远吹冲锋号深入推进新时代党的建设新的伟大工程我们党作为百年大党,要永葆先进性和纯洁性永葆生机活力,必须一刻不停推进党风廉政建设和反腐败斗争为捞政绩执意填海,收受巨额贿赂对抗整改,两位主政三亚官员先后落马甘肃庆阳镇原华池两个县中美科技战探究冲突焦点中的荷兰芯片机巨头艾斯摩尔艾斯摩尔公司鸟瞰图从外面看,它就像一座普通的公司大楼,用了大量的玻璃和钢铁建造,但这座位于荷兰南部的工厂属于艾斯摩尔(ASML),从这里生产制造的机器绝非普通。事实上,这里的技术非宁德时代与福特的合作协议遭遇美国议员反对,美能源部长力挺当地时间2月14日,全球动力电池龙头宁德时代和福特汽车达成协议。福特将会出资35亿美元(约合人民币240亿元)在美国密歇根州新建一座磷酸铁锂电池工厂,通过一家子公司100持有股权,奥联电子暴跌背后仍称胥明军没问题,谁为股民损失担责?中新经纬2月22日电(邓芷若魏薇)22日,奥联电子股价再度暴跌12。39,近两个交易日已累计下跌29。92。有投资者认为,由于履历门事件引发的风波,奥联电子堪称全面注册制后造假崩盘奶酪棒的神仙吃法无需烘焙的豆乳奶酪蛋糕妙飞的奶酪棒有多好吃?糯糯duangduang一抿化开在嘴巴里爆满奶香一口一个仿佛在嚼浓缩牛奶妙飞奶酪棒今天意外的发现了一个超级好吃的奶酪棒DIY。不仅可以一口一个奶酪棒,还能充分双重内陆国的尴尬既左右逢源,又受制于人在苏联时代,当时斯大林将苏联远东地区的朝鲜侨民迁徙到中亚,主要就集中在乌兹别克斯坦,现有大约200000朝鲜裔人口,这些朝鲜裔居民大多赴韩国工作而韩国也是乌兹别克斯坦的重要投资国。一女子病重,名医诊脉后,狠甩她3耳光你红杏出墙,还装病在床元朝时期,浙江一千金小姐,突然一动不动,躺在床上奄奄一息。老父亲就这么一个独女,抱着她老泪纵横,准备了1000两,恳求名医朱丹溪救命。朱丹溪看了眼银子,竟抬手甩了女子3耳光,还大骂造纸术究竟是谁发明的?与蔡伦有什么关系?造纸术是中国古代的四大发明之一,对推动整个人类文明的发展起了重大作用。四大发明不少人受小时候课本的影响,会认为造纸术是蔡伦发明的,但事实并非如此。纸发明前的记载材料自有文明开始,人
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网