Autowired巧妙搭配策略模式
一、策略模式
1.1 策略模式概念
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
1.2 策略模式结构
策略模式的结构包括三种角色:策略(Strategy):策略是一个接口,该接口定义算法标识。具体策略(ConcreteStrategy):具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。上下文(Context):上下文是依赖于策略接口的类,即上下文包含有策略声明的变量。上下文中提供了一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法。
策略模式接口的类图如下所示:
策略模式UML
1.3 常规策略模式不足点
在我们平时写的策略模式代码中,具体采用哪个策略实现类,是在Context类中通过入参来判断的,如果随着需求扩展,需要增加一个新的策略实现类,必定要来修改Context类,这就违背了【开闭原则】。如果能做到:有新的策略实现需要增加时,只需要新建一个策略实现类,去实现策略接口就完事,其他旧代码完全不用修改。这才是我心目中的【开闭原则】,可喜的是,利用@Autowired注解与策略模式搭配,就能实现这一目标。二、@Autowired注解预热
2.1 @Autowired自动装配多个实例
平时我们一般都是通过@Autowired自动装配单个实例,但这里我会告诉你,它也能自动装配多个实例。
2.2 @Autowired实现自动装配多个实例
用一个List集合接收IUser类型的参数@Service public class UserService { @Autowired private List userList; @Autowired private Set userSet; @Autowired private Map userMap; public void test() { System.out.println("userList:" + userList); System.out.println("userSet:" + userSet); System.out.println("userMap:" + userMap); } }
增加一个controller@RequestMapping("/u") @RestController public class UController { @Autowired private UserService userService; @RequestMapping("/test") public String test() { userService.test(); return "success"; } }
userList、userSet和userMap都打印出了两个元素,说明@Autowired会自动把相同类型的IUser对象收集到集合中。
2.3 利用@Autowired自动装配多个实例与策略模式搭配
利用@Autowired自动装配多个实例与策略模式来搭配使用,变种后的策略模式:不需要content类来按条件选择具体的策略类。一个策略接口,多个具体策略实现类。每个具体策略实现类,通过入参参数判断自己是否需要执行,如果不需要执行,直接返回。调用策略的client类,通过@Autowired自动装配多个实例,一次性拿到所有策略实现类,通过循环调用这些策略实现类。有新的策略实现,新建新的具体实现类就可以了,不需要像以前一样去修改content类,真正实现了开闭原则。 三、@Autowired搭配策略模式实现
3.1 需求背景
在我们平时开发的项目中,大部分都会有App站外推送的功能,通常,我们一般都会采用第三方推送集成平台,如某盟或某光。但我们项目为了更高的推送到达率以及更灵活的推送配置功能,我们采用了对接各厂商官方的推送平台的方式,比如对接华为、小米、Oppo等。这个需求场景就非常适合采用策略模式来开发,这次我们用@Autowired搭配策略模式来实现。
3.2 代码实现/** * 推送策略类 */ public interface IPushStrategy { /** * @param userId:用户ID * @param msg:推送消息 * @param supplier:推送供应商 * @return */ boolean push(Long userId, String msg, String supplier); } /** * 华为推送策略 */ @Service public class HuaWeiPushService implements IPushStrategy { @Override public boolean push(Long userId, String msg, String supplier) { if ("HuaWei".equals(supplier)) { System.out.println("华为推送给用户" + userId + ",推送消息:" + msg); return true; } return false; } } /** * Oppo推送策略 */ @Service public class OppoPushService implements IPushStrategy { @Override public boolean push(Long userId, String msg, String supplier) { if ("Oppo".equals(supplier)) { System.out.println("Oppo推送给用户" + userId + ",推送消息:" + msg); return true; } return false; } } /** * 小米推送策略 */ @Service public class XiaoMiPushService implements IPushStrategy { @Override public boolean push(Long userId, String msg, String supplier) { if ("XiaoMi".equals(supplier)) { System.out.println("小米推送给用户" + userId + ",推送消息:" + msg); return true; } return false; } } /** * 推送策略context */ @Component public class PushContext implements IPushStrategy { @Autowired private List pushStrategyList; @Override public boolean push(Long userId, String msg, String supplier) { boolean supplierMatched = false; for (IPushStrategy pushStrategy : pushStrategyList) { supplierMatched = pushStrategy.push(userId, msg, supplier); if (supplierMatched) { break; } } return supplierMatched; } } @Api(tags = "推送策略模式") @RestController @RequestMapping("strategy") public class TestController { @Resource private PushContext pushContext; @ApiOperation(value = "推送") @GetMapping("push") public boolean push() { Long userId = 273L; String msg = "您有新的订单"; String supplier = "HuaWei"; //调用的是华为推送实现策略 return pushContext.push(userId, msg, supplier); } }
3.3 后续故事
声明:以下故事纯属虚构,如有雷同,纯属巧合。
突然,某一天,产品小姐姐跑过来说,我们今天要完成Vivo推送平台的开发和相关功能测试,今天上线,行不行?
这时,我以往心中的那一万匹马这次竟然不见了,我嘴角微微上扬,露出我富有职业素养、标准而又职业的微笑,回答道:行(男人不能说不行)。 我回到工位,新建了一个Vivo推送的策略实现类并进行实现。
幸运的是,之前那些经过测试小妹妹九九八十一次测试好的推送功能代码,一行都不需要改动,保证了程序的稳定性,更降低了测试成本。此时,【开闭原则】在我的心中闪闪发光。
女演员人均绝色,从秋瓷炫到胡静个个惊艳,这部剧真的是沧海遗珠如今的内娱可以说是苦丑男丑女久矣,很多古偶剧的男女主大多都是选秀出身,妆发造型更是一言难尽。但又一部电视剧,剧中的女演员们无论是主角还是配角,颜值放到现在可以说是吊打一群秀人的存在
有人知道这是什么吗?见过七彩祥云的人,运气都不会差。1领导像个啥?1。领导像地狱里的魔鬼身边的人总得生活在他无形的的阴影里2。领导像裤裆里的臭屁虽然脾气臭得令人作呕讨厌,但你还必须得忍受3。领导像一条
7月6日各纸厂废纸收购价格信息华东地区安徽宿州鑫光纸业,废纸价格上调30元吨。安徽萧县林平纸业,废纸价格上调30元吨。安徽兆隆纸业,废纸价格下调30元吨。山东东营市华泰纸业,部分废纸下调30元吨。江苏金田纸业,
年内已有三家中国厂商在印度遭突击调查!vivo作出最新回应7月6日早间,vivo发言人对第一财经记者表示,vivo正在配合印度相关部门,为他们提供所需的所有信息。在前一天,据印度当地媒体报道,印度执法局(EnforcementDirect
俄媒俄国家杜马一读通过保障俄军海外行动法案据俄新社5日报道,俄罗斯国家杜马当天一读通过了为俄武装力量在境外开展反恐和其他行动提供保障的政府草案,根据新规定,法人将无权拒绝签订一系列合同。文件指出,由于开展特别行动,对武器和
那座作为欧洲象征的蓝色欧元雕塑,要被拍卖了据埃菲社法兰克福7月5日报道,作为欧洲象征尤其是欧洲货币象征的巨大蓝色欧元雕塑将在10月中旬被拍卖,因为它的维护成本太高。报道称,这座巨大的雕塑矗立在德国法兰克福的欧洲央行总部旧址
为制造强省锻造技能人才力量来源大众日报原标题为制造强省锻造技能人才力量近年来,我国职业教育发展迅速,技术技能人才逐渐成为一支社会瞩目的重要人才队伍。2022年4月,首届大国工匠创新交流大会成功举办,主题为技
建筑开裂掩体变形日媒日本自卫队四成设施亟待修缮据日本产经新闻7月6日报道,根据日本防卫省汇总的数据,大约四成的自卫队设施是按照建筑基准法修改前的旧抗震标准建造,其中大约八成已过使用年限。报道指出,由于预算不足,营房弹药库等不断
纪实江西已婚男老师出轨女同事,因不愿给10万分手费,酿成悲剧绝大多数的一见钟情都只是见色起意,江西景德镇的一名男英语老师也不例外,出轨女同事后,因不愿给10万分手费,最终酿成悲剧案情回顾孙某是江西景德镇一所中学的一名英语老师,刚毕业时就别分
红楼梦探春,心怀大志的女子年少初看红楼梦只觉里面皆是家长里短一地鸡毛,不堪入目时隔多年再看红楼梦,能看懂里面的一些碎片,让我印象深刻的是探春的一段话我但凡是个男人,可以走得出去,我必早走了,立一番事业,那时
什么样的学生后劲足?班主任坦言高中学霸,基本都具备两个要素导语没有当家长之前我的孩子我只要他开心快乐健康就好了当了家长之后你现在不好好学习,将来你怎么办,你是给我学的吗?你是给你自己学的。不知道以上说的是不是每个家长都必须要经历的一个心路
奔跑的快递小哥变身社情民意信息员原标题从做大规模到做厚价值,边工作边参与基层社会治理(引题)奔跑的快递小哥变身社情民意信息员(主题)记者高萌通讯员饶玥在快递行业摸爬滚打已6年的商金祥是一名普通的快递小哥,目前服务
明美新能IPO收现比存疑货币资金涉不实分红信息冲突高企称号或不符证监会网站显示,深交所上市委将于2023年2月17日审核广州明美新能源股份有限公司(下称明美新能或发行人)的创业板首发申请。作为一家提供锂离子电池技术定制化解决方案的高新技术企业,
组建10个产业联盟,济南民营经济打造产业共同体2月15日,记者从济南市凝心聚力抓项目蓄势赋能促发展主题系列新闻发布会获悉,济南市民营经济发展局计划围绕新一代信息技术高端装备生物医药电子商务等全市集中突破发展的重点产业链,推动民
哈姆分析显示我们在开拓者的三分球攻势下防守表现还不错虎扑02月15日讯昨日,湖人客场115127不敌开拓者,湖人主教练哈姆接受了采访。据哈姆透露,湖人教练组在半场结束时查看了他们的分析报告,发现湖人在防守开拓者的三分球方面总体上做得
永泰天门山和青云山三日游之青云山第二站青云山青云山名字的由来,你知道吗?说起来还有一段佳话呢。相传宋朝,永泰人萧国梁赴京应试,一举夺魁,成为永泰历史上的头名状元,当地老百姓为纪念他少年时曾在此山苦读,便将此山命名
临潼骊山一日游临潼区是西安的东大门,自周秦到汉唐,临潼一直为京畿之地,处于中国政治经济文化活动的中心地带。临潼是仰韵文化时期母系氏族部落先民生存繁衍的地方是烽火戏诸侯周曲王爱妃褒姒一笑失江山故事
一起在恭城三庙两馆景区约个惠关于春天喜欢与爱说之不尽去了有风的地方也要来有花的地方多彩非遗美丽乡村2023年恭城西岭瑶族民俗文化节近期将拉开序幕,欢迎大家来踏春赏花入村访俗品油茶,期待与您在恭城的春天里相遇。
阿木尔林业局把极寒极冷当旅游优势做视野新观察(王力)极寒极冷是稀缺资源,更是真金白银。今年1月22日,大兴安岭阿木尔林业局受极寒天气影响最低气温达到零下53,突破1969年2月13日北极村最低气温52。3的历史极值
你总要看尽世间万千,你才能转过身来独善其身的爱着这个世界该去旅游了,像随行的风随时都能动身万里。在山水相逢的地方乘舟而行,在山河共鸣的地方去长路远游。心怀温暖,眼留清澈,随自由的风去穿越山河海岸,去短暂的远离世俗的地方,把闷闷不乐的心情
波利尼西亚的天堂所在大溪地再这么继续在南太平洋晃荡下去,肤色估计永远白不回去了,为了保持游记的美感,我把证明放在了文章的最后,虽然我一向不能靠脸吃饭,是不能,不是不想。但是也想稍微俊俏一些,没事,我是立志要
文旅为媒,广州携手革命老区龙岩共推高质量发展永定土楼振成楼。2月14日,广州龙岩文旅对口合作座谈在广州举办,来自两地的政府部门和文旅企业代表参加座谈,共同探讨两地文化旅游深入合作的未来方向,为推动两地文旅事业高质量发展出谋献