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

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

  策略模式结构图
  策略模式主要由以上三个身份组成,这里我们就不过多介绍策略模式的基础知识,默认大家已经对策略模式已经有了一个基础的认识。  业务需求
  现有一个广告点击数据埋点上报的需求,上报的埋点数据根据点击的广告位置不同做区分进行上报,每个广告位置的数据进行分表存储。(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的方式,在方法内部进行转换,当然了,如果这样你嫌策略方法太死板了,那么你也可以在方法上加入泛型,具体转换为什么类型,通过调用者传入泛型来转换。
  经过这样一番改造之后,刚才我们遇到的两个问题也都统统不是问题了,我们想要新增一个策略实现类,只需要实现定义的策略类即可,无需增加额外的任何代码。

孩子不是没有任何可取的优点,只是我们没有发现他们的优点而已很多家长都有一个共同点,总喜欢把孩子的弱势扩大化,怎么看都觉得自己的孩子不顺眼,没有其他家的孩子优秀和听话。但实际上,很大一部分原因不是孩子不够优秀,而是我们忽略了他们的优点。对孩切勿模仿!男子让幼儿握方向盘开车还拍摄炫耀扣3分罚200让小孩子开车这种事,已经屡见不鲜,虽然大家都很气愤当家长的不负责任,他们也受到了相应的处罚,但时不时还是会有发生。据青流视频报道,近日在四川甘孜,一段男子让幼儿手握方向盘开车的短视中科院昆明动物研究所揭开1。4万年前云南蒙自人神秘面纱云南不仅见证了寒武纪生物大爆发的奇迹,同时目睹了人科物种从1200万600万年前的禄丰古猿约170万年前的直立人元谋猿人,再到1。4万年前的智人蒙自人等多个人类重要的演化阶段,这表太空技术探索公司美国太空探索技术公司美国以航天为主的公司太空探索技术公司,即美国太空探索技术公司(SpaceX),是一家由PayPal早期投资人埃隆马斯克(ElonMusk)2002年6月建立的美专研成分技术赋能,悦诗风吟重遇新拐点2022年,真正不用建立耐受的A醇精华重磅来袭它就是悦诗风吟A白瓶。一上线就引爆网络,获得大批配方师成分党一致认可。A白瓶是悦诗风吟今年才推出不久的新产品,有着适用于敏感肌的抗初老DBDPJ01A单片机开发应用技术综合实验装置DBDPJ01A单片机开发应用技术综合实验装置(挂箱积木式)一概述单片机开发应用综合实验装置由控制屏实验挂箱实验桌组成,通过本实验台可完成单片机的接口扩展数据采集数据显示键盘控制定国产芯片接连发布,汽车芯片行业标准呼之欲出导语在本月十八号召开的中国汽车芯片高峰论坛中,中国汽车芯片标准工作启动了三批项目起草组,这标志着中国汽车芯片的标准呼之欲出。撰文蔡家伦编辑禾子之所以会如此迅速的制定标准,一方面是因金融信息服务行业研究B端为基,C端为器(报告出品方作者招商证券,刘玉萍孟林)行业整体情况金融信息服务内涵及产业链金融信息服务行业即以互联网技术为核心手段,依托网站电脑及手机端软件等载体向用户提供股票基金债券期货等金融产蓝帆医疗拟投资不超过24。8亿,建设科创总部及产业化基地新京报讯(记者张兆慧)12月14日,蓝帆医疗发布公告,拟在上海市浦东新区上海国际医学园区投资建设蓝帆医疗科创总部及产业化基地项目。该项目用于蓝帆医疗全球商业总部及高值产医疗器械生产临高金牌港开发区瞄准三大产业跑出加速度金牌港开发区相关负责人介绍园区产业布局新海南客户端南海网南国都市报12月14日消息(记者林文泉)14日,记者从2022首届海南自贸港(临高)乡村振兴发展论坛暨经济合作洽谈周获悉,临雾化的危害到底有多大?给宝宝做雾化之前一定要先了解这些孩子一到冬天就咳嗽,因此雾化就成了家长们时常挂在嘴边的词语。不过很多家长似乎对雾化并不是很了解,一听到这两个字就焦虑,今天,我们就来好好认识一下雾化。雾化是指通过专用设备将药物分散
1150亿!今年以来最大交易!全球矿企大并购时代来了?李惜2023年至今为止全球最大的一笔矿业并购来了!近日,全球最大的黄金矿企纽蒙特公司(NewmontCorp。)已向澳大利亚最大的金矿企业纽克雷斯特矿业公司(NewcrestMin12000亿元,福建海洋经济有这么多第一!7日,记者从福建省海洋与渔业局获悉,2022年福建省海洋经济规模继续保持全国前列,预计全省海洋生产总值1。2万亿元,占地区生产总值23。全省水产品总量862。4万吨,其中海水养殖产多地药店连花清瘟降价,以岭药业市值蒸发400亿元华夏时报(www。chinatimes。net。cn)记者郭怡琳于娜北京报道随着国内整体疫情进入低流行水平,多地药店连花清瘟价格回落。2月7日,华夏时报记者随机走访北京市区多家连锁柳州经济停滞不前存隐忧,被二十城挤出百强榜,又面临被钦州超越柳州市的经济这几年真是非常的不如意,已经连续几年停滞不前。尽管有人气火爆全国的柳州五菱汽车和柳州螺蛳粉,但是依然无法挽救柳州经济全国排名喋喋不休的下滑的局面。未来几年内还将面临被钦延迟退休大局已定,方案或将公布,三大利好值得关注根据第七次人口普查数据显示,我国60岁以上人口数据达到2。64亿,占全国总人口的18。7,人口老龄化逐步加剧。再2022年的人口增长数据来看,全年出生人口956万人,人口出生率为6萝卜营养丰富,做成丸子更酥脆今天为大家来制作一道家常炸萝卜丸子采用天津沙窝萝卜擦成丝,撒入少量的盐,把水分浸出来然后用纱布挤干。加入盐味精葱姜末,再加入面粉搅拌均匀。萝卜丝调制撒盐一定要适量,呈黏稠度的状态。刚刚,央行发布1号令!作者丨杨希编辑丨方海平图源丨视觉中国公开征求意见近半年后,金控公司关联交易办法正式下发。为规范金融控股公司关联交易行为,促进金融控股公司稳健经营,防范金融风险,央行制定了金融控股公芙蓉国评论加快释放红利,为稳增长争取主动围绕促进消费恢复升级,湖南稳增长20条提出一系列着力恢复和扩大消费的扎实举措,鼓励各地联合金融机构平台企业发放消费券,省级统筹相关资金按各市州实际支出的30给予补贴,最高可补贴10免洗洗手液有什么成分?它的原理又是什么呢?我们知道,洗手的目的是去除手上的污物和细菌病毒。用肥皂洗手后,必须再用水冲掉手上的肥皂残留物。然而,有一种免洗洗手液,只要倒一点在手上搓一搓,就能把手洗干净,不必再用水冲洗。免洗洗现场直击丨职等你来!各地春风行动一睹为快2023年春风行动暨就业援助月活动正在各地火热开展各省市县密集举办线上线下招聘活动集中送政策送岗位送服务今天,我们一起去下面这些现场看看吧!山西1月29日,2023年太原市春风行动阿媛好书推荐之中国神话有意思文化根脉的断绝始自不读书,想重拾传统文化,也必须从读书开始文字背后是故事,故事的背后是时间和历史,时间和历史背后,潜伏着的就是我们这个民族的文化根脉,是传统文化本来的样子今天阿媛好