范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  策略模式结构图
  策略模式主要由以上三个身份组成,这里我们就不过多介绍策略模式的基础知识,默认大家已经对策略模式已经有了一个基础的认识。  业务需求
  现有一个广告点击数据埋点上报的需求,上报的埋点数据根据点击的广告位置不同做区分进行上报,每个广告位置的数据进行分表存储。(eg:这里大家也不必深究分表存储为什么要这么做,我们只聊策略模式的实际应用)  代码实现
  由于是实战案例,那么我们是基于SpringBoot框架的,主要要使用的Spring的一些功能,所以大家要注意。  第一步:定义策略类
  首先我们定义一个上报的接口  public interface AdvertisingDataReported {      String advertisingDataReported(Object param); } 第二步:定义具体的策略实现类@Service public class BottomAdvertisingDataReported implements AdvertisingDataReported {          @Override     public String advertisingDataReported(Object param) {        // 具体的业务逻辑略         return null;     } } 第三步:策略控制类
  由于策略模式有好多具体的具体策略实现,那么到底使用哪一个策略需要根据我们的入参,也就是我们业务中的广告类型进行判断,那么我们该如何优雅的进行判断呢?
  我们先看看这种方式  public static void main(String[] args) {            String advertisingType = "1";    if (advertisingType.equals("1")) {     // 执行策略A   } else if (advertisingType.equals("2")) {     // 执行策略2   } }
  这么写的大有人在,我们这里也不讨论这些问题。我们先看一下这么写存在哪些问题?
  「存在的问题:」  1. 违反开闭原则,每次增加新的策略实现类,都要加一个if判断; 2. 随着策略实现类的增加,代码变的臃肿,越来越难以维护;
  基于这种情况,我们可不可以在项目启动的时候,将所有的策略实现类进行初始化,存储在Map当中,广告类型作为key,实现类作为Value,我们看如下代码:  @Component public class StrategyFactory implements ApplicationContextAware {      private final Map STRATEGY_MAP = new ConcurrentHashMap<>();      @Override     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        // 返回该接口所有的实现类         Map tempMap = applicationContext.getBeansOfType(AdvertisingDataReported.class);         tempMap.values().forEach(strategyService -> STRATEGY_MAP.put(strategyService.getClass().getName(), strategyService));     }      public  AdvertisingDataReported getInstance(Class clazz) {         return STRATEGY_MAP.get(clazz.getName());     } }
  我们的策略控制类实现了ApplicationContextAware,这个类你可以这么理解,它可以获得ApplicationContext的上下文,由于我们是至于SpringBoot讲这个案例的,我们的策略类实现类都加了@Service注解注入到了Spring容器中,所以我们可以直接从容器中,取到策略类的所有实现类。
  获取到所有的策略实现类之后,我们把类路径作为key,类的实现作为value存储到了map中,到此我当时觉得就大功告成了。
  「大家觉得还存在什么问题?」
  我们怎么知道这个入参需要走哪个具体的策略类呢?还需要定义一个单独的类,来 「对广告类型和策略类进行映射」 ,那这跟判断不又是同一个逻辑的吗?还得一直维护这个映射关系。 改造
  如果不想单独的定义一个类对广告类型和策略类进行一一映射,那么我们可不可以在策略类中进行解决,每个策略类实现类知道它要处理哪种类型,这样我们就可以把map中Key类路径的值替换为广告类型,这样就可以根据上报接口入参的广告类型,直接从Map中进行get。
  具体的实现有两种,你可以自定义注解,通过加注解的方式进行区分,也可以使用方法,那么我们这里直接使用方法进行处理。
  「改造后的代码:」
  策略类:  public interface AdvertisingDataReported {     // 新增方法     AdvertisingTypeEnum advertisingType();      String advertisingDataReported(Object param); }
  策略实现类:  @Service public class BottomAdvertisingDataReported implements AdvertisingDataReported {      @Override     public AdvertisingTypeEnum advertisingType() {         return AdvertisingTypeEnum.BOTTOM;     }      @Override     public String advertisingDataReported(Object param) {         return null;     } }
  策略控制类:  @Component public class StrategyFactory implements ApplicationContextAware {     // Map的Key改为广告类型枚举类     private final Map STRATEGY_MAP = new ConcurrentHashMap<>();      @Override     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {         Map tempMap = applicationContext.getBeansOfType(AdvertisingDataReported.class);         tempMap.values().forEach(strategyService -> STRATEGY_MAP.put(strategyService.advertisingType(), strategyService));     }     // 根据广告类型获取相应的策略类     public  AdvertisingDataReported getInstance(AdvertisingTypeEnum advertisingTypeEnum) {         return STRATEGY_MAP.get(advertisingTypeEnum);     } }
  广告枚举类:  public enum AdvertisingTypeEnum {      BOTTOM, TOP;      private String advertisingType;      AdvertisingTypeEnum() {}       // set get省略 } 策略类的具体使用@RestController public class AdvertisingDataReportedController {      @Resource     private StrategyFactory strategyFactory;      @RequestMapping(value = "/reported/data", method = RequestMethod.POST)     public String reportedData(AdvertisingTypeEnum advertisingTypeEnum, Object obj) {          AdvertisingDataReported dataReported = strategyFactory.getInstance(advertisingTypeEnum);          String result = dataReported.advertisingDataReported(obj);          return "SUCCESS";     } } 小小总结:
  到这里我们这个策略模式的案例就算结束了,有几个问题不知道大家有没有疑惑,为什么我要用Object作为方法的入参,我们这种案例中,好像每个策略类的入参好像都是一样的,但是也有可能出现同一个策略的实现类,但是入参完全可能不相同,那么这个时候,我们就可以通过传入Object的方式,在方法内部进行转换,当然了,如果这样你嫌策略方法太死板了,那么你也可以在方法上加入泛型,具体转换为什么类型,通过调用者传入泛型来转换。
  经过这样一番改造之后,刚才我们遇到的两个问题也都统统不是问题了,我们想要新增一个策略实现类,只需要实现定义的策略类即可,无需增加额外的任何代码。

国内油价或再次下调,预计92号汽油价格可能迈入7元时代随着第十八次调整油价的时间临近,不少人都将关注放在了新油价之上。今年以来油价飞升早就成为了大部分有车一族的心头痛,虽然已经下调过几轮的油价,但是现在的油价还是不太让人们满意。根据预紫云山的红叶我从没见过这样一山的红叶。红的像燃烧的霞,艳的像竞放的花,娇的如美人醉酡的脸。一山的烈焰腾腾,一山的热烈奔放,一山的汪洋恣肆。我站在宽大的停车场,望巍峨在蓝天下的高高的山门,望通往全球旅游复苏,邮轮订单排到2028全球旅游业正逐渐回到疫情前的水平,某些指标甚至已经超过2019年同期。比如据美国旅游协会的数据,美国7月的旅行支出已和2019年同期持平,连续四个月达到或高于疫情前。靠岸两年的豪华国庆假期选择思田阳光房,过一个不一样的国庆节不知不觉,2022年已经过去了一大半。一年一度的国庆节到了,放假期间,喜欢旅游的亲们又开始蠢蠢欲动了,看山看水看风景,好不惬意!国庆旅游可现实的国庆假期旅游又是另一番景象这边人潮涌浩气激荡天地间赓续前行绽芳华第九个烈士纪念日到来之际缅怀公安英烈本报记者董凡超祖国和人民不会忘记党的十八大以来,全国公安机关共有3700余名民警牺牲。山川知道他们的名字今年1月至8月,全国公安机关又有184名民警87名辅警因公牺牲,2628名民台湾往事民进党是如何崛起,并成为台湾第一大党的?在甚嚣尘上的台独声浪中,民进党是个非常打眼的名词。该政党诞生于上世纪八十年代中期,却很快发展成为当地最大的本土派政党,与此前掌控当地政局的国民党分庭抗礼。回望过往,这些台湾往事,已如果在长平之战中赵国没有换将,廉颇对战白起,最后谁会赢?长平之战,是我国封建王朝历史上最有名的战争之一,正是通过这场战争,秦国彻底结束了赵国的有生力量。长平之战之后,秦国大一统的历史进程进一步加快,是秦国当年战略意义最为重大的一场战争,兰州战役马家军凶悍的像日军,彭德怀怒令全部歼灭,一个不留如果喜欢我的文章,请点一下右上角关注,持续为您奉上诚意好文。谢谢您的支持!1949年8月26日晚,解放兰州战役刚刚结束,彭德怀撇开一堆堆文件,焦急地找来一份伤亡数字统计,看完之后,郑成功英年早逝,为什么要在临终前,下令杀妻灭子?一代民族英雄郑成功39岁英年早逝,然而令人匪夷所思的是,他却在临终前下了一条命令将自己的妻子儿子孙子统统处死。郑成功临终前到底经历了什么?他又为什么要做这种残忍之举呢?都说家家有本十一参观天安门广场需提前预约,已预约周边五景点无需再约北京日报客户端记者任珊为营造天安门地区喜庆祥和安全有序的节日氛围,保障天安门地区广大游客参观游览体验,9月29日,天安门地区管理委员会发布十一假日期间参观游览服务提示。鉴于预约10门头沟民宿中的美丽乡村体验游主题线路探古寻幽,古村落体验乡村民俗线路节点双龙峡(乘坐山间小火车,游船滑草,射击体验)马栏景区(在美丽休闲村探寻红色事迹和古村文化)爨舍客栈(晚餐享用爨美食)爨柏景区(探寻明清古村落,感受爨文化爨造社文创店感受时空
广州与佛山之间有一条跨市地铁线,已经运营十多年,依然人气很旺这里是刘小顺的旅行和生活研究所。大家应该知道,广东省的省会广州是我国四大一线城市之一,而紧邻广州的另一座地级市佛山同样也是一座经济实力雄厚的新一线城市。由于广州与佛山的市中心距离非灵丘3景区入列国家AAA级景区公示名单近日,灵丘县A级旅游景区创建再上新台阶,车河有机社区花塔生态民俗景区觉山寺旅游景区3处旅游景区成功入列国家AAA级旅游景区公示名单。依据中华人民共和国国家标准旅游景区质量等级的划分2022爱心厦门走起同安文化旅游推介会在长汀举办2022爱心厦门走起同安文化旅游推介会在长汀举办2022年12月23日上午,由厦门市文化和旅游局厦门市同安区人民政府主办,厦门市同安区文化和旅游局承办的2022爱心厦门走起同安文化千亿投资打水漂?华为麒麟芯片正式归零,任正非不以赚钱为目的众所周知,我国科技起步较晚,在很多行业都有技术壁垒,尤其在芯片领域。如果中企要想在芯片领域争得一席之地,其难度之大,不亚于自研操作系统。作为中国科技企业的代表,华为展现出了绝对的实非人灵长类动物的成功低温为远途宇宙飞行提供支撑前视神经元如何驱动体温过低和冷防御的插图,以及在太空飞行中潜在应用的示例。冬眠是某些哺乳动物为适应不利的冬季条件而采用的一种状态。冬眠的典型特征包括代谢活动大大降低和体温降低。作为2096元特斯拉发布无线充电板一次性可充三台设备特斯拉杂货铺又上新产品了,这会是无线充电面板。近日,特斯拉在其海外官网上线了一款无线充电板,售价300美元,约合人民币2096元,并将于2023年2月正式销售。特斯拉介绍称,这款无最快2023年年中,华为小米比亚迪必将掀起裁员潮现在全面放开了,很多人欢呼雀跃,认为经济肯定会腾飞起来了。愿意消费的人,天天都可以去餐馆商场,营业厅,美术馆。或者说在大街小巷里面不戴口罩的人都认为经济已经好起来了。疫情也已经消失豪门女婿也不好当,贝克汉姆大儿都快成赘婿,圣诞节也是分开过2022生机大会对于西方那些人来讲,圣诞节是重要节日,一些有名望人都会在这里晒出全家福,借机维持一下人气。最近辣妹维多利亚上传一家人照片,中年大叔两个半大小伙,还有小七,再穿的都是圣诞节可以送男女朋友的高颜值轻薄本华硕a豆家族圣诞节你准备好礼物了吗?与其选择华而不实的鲜花摆件,不如看看更为实用的笔记本电脑。华硕a豆系列主打年轻市场,专注于轻薄便携新颖配色,配置多样,最新推出的a豆14Pro更是搭载12代平安夜狂野的金卡戴珊(KimKardashian)紧身豹纹连衣裤金卡戴珊(KimKardashian)穿着和相配的高跟靴,展示了她狂野的一面周六,金卡戴珊(KimKardashian)展示了她身穿醒目的豹纹紧身连衣裤和搭配的过膝高跟靴的惊人妖怪网约车行业最惨圣诞节,司机乘客都去哪儿了?全文共890字,阅读需约30秒网约车观察12月25日消息,一年一度的圣诞节又到了,每年一到这种节日都是网约车行业的旺季,各地都会乘客排队都打不打车的情况,但是今年的圣诞节,网约车行