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

Lattice基于扩展点的业务叠加

  在上一篇《Lattice面向高可扩展的业务框架》中,我们介绍了如果快速定义一个业务级扩展点,并能基于这个扩展点实现业务定制的插件化。同时,在例子中,我们也给出基于业务身份做业务定制逻辑的隔离。
  在本文中,我们将进一步介绍,当一个扩展点有多个实现时,是会产生业务叠加的。业务逻辑叠加如果处理不好,往往就是代码腐化、噩梦的开始。关于业务叠加导致平台代码是如何腐化的,可以参考《一次代码腐化的演进过程》。
  在读者看完上述两篇文章后,我会在本文分两部分来介绍业务叠加:能力这个关键概念的介绍基于能力定义,实现业务叠加的样例
  能力概念介绍
  在Lattice框架里,有一个叫做能力(Ability)的名词。这里,我就用这个名词做下我的理解。
  《吕氏春秋适威》:民进则欲其赏,退则畏其罪,知其能力之不足也!
  《三峡之秋》二:长江蕴藏着无限丰富的水能;三峡形成了天然的水利枢纽。这在我国的建设事业中,有可能变成一种巨大的能力。
  毛主席在《纪念白求恩》中写道:一个人能力有大小,但只要有这点精神,就是一个高尚的人。
  领导在平台开工会中提到:一个平台能力有大有小,但只要架构优秀并持续改进,就是一个有希望的平台
  从上面的名家言论中可以看出,能力是对人、物等特定载体在某些场景下所表现出的一组行为的描述。
  打个比方,我们在谈到人这个能力载体时,我们会说:人具备改变世界的能力人具备繁衍后代的能力人具备扯淡的能力相声演员(人)具备说学逗唱的能力体育运动员(人)具备跑跳的能力。。。。。。。。。。。。。
  能力的特征
  如果我们再进一步细分,人这个载体又是由头、躯干、四肢、经血、脉络以及各种内脏组成。这些不同的部件,也可以作为一个载体提供一些更加细分、具体的能力。比如,手这个载体,虽然他不具备繁衍后代的能力。但是手的能力有:可以弯曲的能力、可以负重的能力。手弯曲的行为有手腕弯曲、手指弯曲,手的负重行为可以有以手掌方式负重、手指方式负重。手这个部件的能力以及其行为虽然很有限,但是配合起来可以完成俯卧撑,最终支撑并实现了人类繁衍更加重要能力的实现。
  所以,能力是可聚合的
  说到了能力的行为,行为应该可以扩展的,扩展后的行为可以做更多的之前做不到的事。比如挠痒这个行为。其实挺简单,基本的挠痒动作就是用手去抓嘛,能抓得到的地方就去抓好了。但对于抓不到的地方,那怎么办?你至少有两种选择:换个行为,改用蹭,找个地方对准痒处使劲蹭。。还是用挠这个行为,不过得扩展一下手,再配合使用不求人完成对痒处的挠
  所以,能力的行为是可扩展的
  刚刚提到的手的能力及其行为,都是原生的,与生俱来的。但是,我们是可以通过给人增加外挂,增加一些原本不具备的能力。比如,给眼睛配上夜视眼镜,人就具备了如猫一样可以夜视行为。夜视眼镜的载体是眼睛,对看这个行为进行了扩展,从而使人具备夜视的能力。
  所以,某些能力不一定是原生的,是可以通过工具后叠加的
  有时候,你在某个方面可能真的很牛逼。比如,你唱歌很好、舞跳得棒、乒乓球也是一把好手。可是如果你不去介绍自己、不在特定场合去表现自己,那么谁也不知道你有啥能力。
  所以,能力是一定是能被呈现的
  如果能理解上面的概念,那么在回过头来看Lattice中关于能力接口的定义。
  在Lattice中,我们定义了能力接口IAbility,如下:publicinterfaceIAbilityBusinessExtextendsIBusinessExt{StringgetCode();能力编码StringgetInstanceCode();AbilityContextgetContext();能力上下文booleansupportChecking();能否是否生效检查BusinessExtgetDefaultRealization();能力缺省默认实现能力执行器T,RRreduceExecute(ExtensionCallbackBusinessExt,Tcallback,NonnullReducerT,Rreducer);}
  IAbility能力中有两个关键的方法,一个是supportChecking。是用来检查在特定的业务约束下(bizCode),对于特定的载体,本能力是否支持?简单地打比方:看这个行为,去问手这个载体,应该得到false的结果看这个行为去问眼睛,应该得到true的结果
  另一个方法是reduceExecute(),他会根据能力上下文,去获取并执行特定的行为。比如:针对眼睛这个载体获取出EmptyEyeRealization,那么就代表没有可用行为,比如盲人针对眼睛这个载体取出的是基本实现NormalEyeRealization,那么就可以完成基本看的行为针对眼睛这个载体取出的是增强版EnhancedEyeRealization,那么就可以完成夜视行为
  基于能力定义,实现业务叠加的样例
  环境准备
  您需要:用于运行程序的IDE(集成开发环境),比如IntelliJIDEA或其类似工具;JavaDevelopmentKit(JDK),需要JDK8及以上版本完成阅读:Lattice面向高可扩展的业务框架
  版本依赖dependencygroupIdorg。hiforce。latticegroupIdlatticemodelartifactIdversion1。0。8。3versiondependencydependencygroupIdorg。hiforce。latticegroupIdlatticeruntimeartifactIdversion1。0。8。3versiondependency
  Step1:定义团购场景GroupBuyProduct产品Product(codeGroupBuyProduct。GROUPBUYPRODUCTCODE,nameGroupBuyTradeProduct)publicclassGroupBuyProductextendsProductTemplate{publicstaticfinalStringGROUPBUYPRODUCTCODElattice。productGroupBuyProduct;OverridepublicbooleanisEffect(ScenarioRequestrequest){if(requestinstanceofBuyScenarioRequest){booleaneffectStringUtils。equals(groupBuy,((BuyScenarioRequest)request)。getSource());System。out。println(GroupBuyProducteffectstatus:effect);returneffect;}returnfalse;}}
  产品定义需要用Product注解标识,同时需要继承ProductTemplate抽象类,并实现isEffect方法。团购产品的生效条件:当前的场景是买家下单场景,即ScenarioRequest是BuyScenarioRequest如果渠道来源是groupBuy,当前产品则生效
  Step2:团购产品实现自定义商品单价扩展点
  在《Lattice面向高可扩展的业务框架》,平台定义了一个自定义商品单价的扩展点。在这里,我们让团购产品去实现这个扩展点,并假定在团购平台上,商品单价打7折。如下:Realization(codesGroupBuyProduct。GROUPBUYPRODUCTCODE)publicclassGroupBuyProductExtextendsBlankOrderLinePriceExt{OverridepublicLonggetCustomUnitPrice(OrderLineorderLine){returnorderLine。getUnitPrice()7001000;onlyforsample。}}
  注:这里的价格计算只是用于DEMO,实际的价格计算不能用类型强制转换
  Step3:构造买家下单场景的请求publicclassBuyScenarioRequestimplementsScenarioRequest{GetterprivatefinalOrderLineorderLine;GetterSetterprivateStringsource;publicBuyScenarioRequest(OrderLineorderLine){this。orderLineorderLine;}OverridepublicOrderLinegetBizObject(){returnorderLine;}}
  Step4:构造一次面向买家下单场景的业务调用过程publicstaticvoiddoBusiness(Stringsource){OrderLineorderLinenewOrderLine();orderLine。setUnitPrice(1000L);orderLine。setBizCode(business。b);try{LongunitPricenewBizSessionScopeLong,OrderLine(orderLine){OverrideprotectedLongexecute()throwsLatticeRuntimeException{bla。bla。blaOrderLinePriceAbilityabilitynewOrderLinePriceAbility(orderLine);returnability。getCustomUnitPrice(orderLine);}OverridepublicBuyScenarioRequestbuildScenarioRequest(OrderLinebizObject){BuyScenarioRequestrequestnewBuyScenarioRequest(bizObject);request。setSource(source);addsomeotherinfo。returnrequest;}}。invoke();System。out。println(〔BusinessB〕overlayproductunitprice:unitPrice);}catch(LatticeRuntimeExceptionex){System。out。println(ex。getErrorMessage()。getText());}catch(Throwableex){ex。printStackTrace();}}
  一次业务调用过程,我们用BizSessionScope进行包装。原因在于:一个业务可以叠加非常多的产品;你可以想象,在电商生态中有一个AppStore,每个业务都可以从AppStore中选择并安装产品;一次业务调用,并不是业务安装的产品都会生效,比如本例中的团购产品,只有在下单渠道是groupBuy时才会生效;一次业务调用中,我们需要过滤出本次会话实际生效的产品,并将生效的产品与业务叠加后,再进行扩展点调用以及多份扩展点实现的Reduce
  所以,BizSessionScope会再被首次构造上,进行业务配置处理、生效的产品过滤、本次会话范围缓存初始化以及业务上下文初始化。
  Step5:样例演示
  我们演示两次业务调用过程:第一次业务的渠道来源是null,商品价格就是商品单价1000L第二次业务的渠道来源是groupBuy,团购平台要求商品单价必须打7折,产品的定制逻辑优先(这个一般是业务和平台产品签约时约定的)publicclassLatticeOverlayProductSample{publicstaticvoidmain(String〔〕args){Lattice。getInstance()。setSimpleMode(true);Lattice。getInstance()。start();System。out。println();doBusiness(null);System。out。println();doBusiness(groupBuy);System。out。println();}。。。。。。}
  运行结果如下:GroupBuyProducteffectstatus:false〔BusinessB〕overlayproductunitprice:1000GroupBuyProducteffectstatus:true〔BusinessB〕overlayproductunitprice:700
  我们可以看出,在团购产品生效时,自定义商品单价扩展点,返回的是团购产品的定制实现,即商品打了7折。
  本样例代码URL:https:github。comhiforcelatticesampletreemainlatticeoverlayproduct

太原人,明日立春要咬春,吃这些就对了寒随一夜去,春逐五更来。明日立春立即开始之意它位居二十四节气之首意味着新一年四季轮回起始立春三候一候东风解冻,二候蜇立春虫始振,三候鱼陟负冰立春后天气开始回暖人们会明显感觉到白天变收藏!常见慢性病的忌口都在这里,关键时候很实用!患有慢性病的人,日常饮食中需要特别注意,到底哪些食物要少吃呢?现在,都给你列出来了忌口清单!收藏!高血压01咸食无论是高血压患者,还是普通人都该注意摄入食盐量。每人每天吃盐量应严格拒绝逆转!汤普森142,丁威迪253,普尔太尴尬,库里成历史第一北京时间2月5日,NBA常规赛勇士主场迎战独行侠,赛前,勇士26胜26负排名西部第10,而独行侠28胜25位居西部第4,此役东契奇缺阵,库里会有怎样的发挥值得期待。首发阵容方面,勇马布里再邀前队友加盟,巩晓彬入男篮任新职,闵鹿蕾重返首钢出山文小桢仅仅过了一个春节,北控男篮和马布里之间的换帅二人转又迎来了新反转。据悉,返美休假的马布里已于近日重返北京,同时将在第三阶段取代张劲松重掌球队帅位,毕竟是北京最热的篮球名人和卖医学养生颈椎病,多少人深受其苦,预防颈椎病的好方法!俗语说头重七斤半。一天24小时中近23时间,人是直立体位,七节颈椎相对细小,所以支撑整个头部的负担是非常重的,斜方肌起了重要的支撑作用。颈椎病近30年发病率大增,究其原因,一是电脑字母351511利拉德40分不是今日最佳,杜兰特替身轰44分一战成名1。太阳116100活塞艾顿出场31分钟,15投13中,6罚中5,得到31分16篮板2助攻1盖帽,太阳客场取胜。2。鹈鹕131126湖人浓眉上场38分钟,25投13中,三分球5中2泰大师赛冯彦哲黄东萍复仇夺冠,张艺曼逆转韩悦捧杯北京时间2月5日消息,2023年世界羽联世界巡回赛超级300级别泰国大师赛展开决赛争夺,中国队赢得两项冠军。张艺曼逆转战胜队友韩悦赢得女单冠军,冯彦哲黄东萍在混双决赛以2比1逆转战全国国际象棋锦标赛(个人乙组)落幕朱恒佚颜天琪分获男女组冠军新华网海口2月5日电中国国际象棋协会消息,经过6天的激烈争夺,全民健身棋牌普及与推广2022年全国国际象棋锦标赛(个人乙组)日前在海南结束了全部11轮比赛,中国棋院杭州分院棋手朱恒辗转4小时奔赴龙华,广州球迷手绘海报为女篮应援2月5日晚730,2023年WCBA全明星赛在龙华文体中心举办。这是疫情三年来,中国女篮首次面对观众开赛。龙华区文体中心外,早早有一批球迷等待进场。其中,有一位球迷显得格外特别。带俄罗斯联盟2。1a运载火箭完成组装当地时间2月4日,俄罗斯国家航天集团发布消息称,用于将进步MS22运输飞船送入太空的俄罗斯联盟2。1a运载火箭已在位于哈萨克斯坦拜科努尔航天发射中心完成组装,即将发射。此外在联盟2反重力,不明飞行物,美国政府到底隐藏了什么?如果有智慧的外星生命存在,特别是如果它曾经造访过地球,那么很有可能它会携带一些超级先进的技术。假设一艘潜在的外星飞船从某个遥远的恒星系统或星系出现在这里,它必须能够跨越遥远的星际空
狩猎之道上线steam国区,开放游戏新体验这是一款第一人称狩猎模拟游戏。玩家将在游戏中扮演一个经验丰富的猎人。他刚刚接管了他祖父的狩猎小屋,并打算继续销售高质量猎物肉的家族传统。玩家将在美国和欧洲广阔的开放世界中探索现实。3款有趣的小游戏,绝对好玩,不信你捶我今天,给大家推荐3个好玩有趣的在线小游戏,可玩性非常高,而且十分有趣。可以在繁忙的工作之余,小小摸鱼,缓解枯燥的工作压力狗头01在线养乌龟网址httpwww。changshougu居居直播爆料今屿很抢手,多支战队对其有意向夏季赛即将结束,大家最关心的就是有没有转会期,这个问题也是各大论坛讨论的热点,在之前某鱼二路解说gemini爆料世冠之前会有转会期,但后面好像取消了,所以这个问题无人能够解答。这个我的世界传奇消息泄露!新生物獾,联机PVP等更多内容Minecraft传奇世界背景,是建立在一个村庄中村民们口口相传的故事,没有人知道这个故事和传说是真是假。只是每天在睡前,大村民对小村民讲的一个睡前故事罢了。世界背景在很久很久以前五大天价中锋,哈兰德5场9球英超霸榜,弗拉霍维奇4场4球意甲霸榜头条创作挑战赛202223赛季联赛已经开始,高额转会费引进的超级年轻中锋们也开始了各自的表演。以哈兰德为首的五大中锋在新赛季会有怎样的表现,我们拭目以待。1哈兰德,转会费用850042岁姚明给吴冠希安排任务,让张常宁多生几个,为何自己不生二胎说到姚明吴冠希张常宁相信很多球迷朋友不陌生,姚明是中国篮球的骄傲,职业生涯不管是在CBA还是NBA都打出了自己的一片天,吴冠希是CBA的未来之星,如今也拿着顶薪,张常宁是中女排的骄NBA一夜6大交易动态纳什嘲讽杜兰特布朗和管理层矛盾彻底爆发一名记透露湖人将放弃特纳的交易这个夏天关于特纳加盟湖人的消息传的沸沸扬扬,很多媒体频繁传出湖人将用威少2首轮换特纳和希尔德,今天湖人内部记者进行了辟谣,他表示湖人目前已经打消了交易离开勇士身价暴涨8倍,从无球可打到拿千万合同,是勇士改变了他新赛季即将开打了,上赛季在勇士队效力的很多球员在新赛季将会披上其他球队的战袍,达米安李将会身披太阳队的战袍。奥托波特将会身披猛龙队的战袍。安德森会身披湖人队的战袍,而小佩顿将会携手45分狂胜后再赢21分!湾区翼龙豪取5连胜建队至今还没输过球近日,湾区翼龙又进行了一场热身赛,凭借着全队的努力,最终以11998击败PBA球队泰拉菲尔马。在拿下这场大胜以后,湾区翼龙今夏热身赛继续保持不败金身,已经豪取一波五连胜了。在过去几篮网15人大名单出炉,珍妮巴斯拒绝摆烂,爵士拒绝3换1交易报价北京时间9月1日,NBA自由市场正在进行,其中雷霆官方宣布,傍晚霍姆格伦成功接受手术,仍然会缺席整个20222023赛季所有的比赛,奇才正坚定追求米切尔,觉得自己并未落后尼克斯太多让冬奥遗产成为造福人民的优质资产合理有效开发利用好冬奥遗产,才能使丰硕冬奥遗产成为造福人民惠及长远的优质资产丢掉放羊鞭,拿起滑雪板,乘着北京冬奥会的东风,北京市延庆区张山营镇的18名农民组建了延庆区第一支农民滑雪
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软网