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

Lattice基于扩展点的业务叠加

  在上一篇 《Lattice - 面向高可扩展的业务框架》中,我们介绍了如果快速定义一个业务级扩展点,并能基于这个扩展点实现业务定制的插件化。同时,在例子中,我们也给出基于"业务身份"做业务定制逻辑的隔离。
  在本文中,我们将进一步介绍,当一个扩展点有多个实现时,是会产生业务叠加的。业务逻辑叠加如果处理不好,往往就是代码腐化、噩梦的开始。关于业务叠加导致平台代码是如何腐化的,可以参考《一次代码腐化的演进过程》。
  在读者看完上述两篇文章后,我会在本文分两部分来介绍业务叠加:能力 这个关键概念的介绍基于能力定义,实现业务叠加的样例
  "能力"概念介绍
  在Lattice框架里,有一个叫做"能力(Ability)"的名词。 这里,我就用这个名词做下我的理解。
  《吕氏春秋·适威》:"民进则欲其赏,退则畏其罪,知其能力之不足也!"
  《三峡之秋》二:" 长江蕴藏着无限丰富的水能; 三峡 形成了天然的水利枢纽。这在我国的建设事业中,有可能变成一种巨大的能力。"
  毛主席在《纪念白求恩》中写道:"一个人能力有大小,但只要有这点精神,就是一个高尚的人。"
  领导在平台开工会中提到:"一个平台能力有大有小,但只要架构优秀并持续改进,就是一个有希望的平台"
  从上面的名家言论中可以看出,能力是对人、物等特定载体在某些场景下所表现出的一组行为的描述。
  打个比方,我们在谈到"人"这个能力载体时,我们会说: 人具备改变世界的能力 人具备繁衍后代的能力 人具备扯淡的能力 相声演员(人)具备说学逗唱的能力 体育运动员(人)具备跑跳的能力 .............
  能力的特征
  如果我们再进一步细分,人这个载体又是由头、躯干、四肢、经血、脉络以及各种内脏组成。这些不同的部件,也可以作为一个载体提供一些更加细分、具体的能力。 比如,手这个载体,虽然他不具备繁衍后代的能力。但是手的能力有:可以弯曲的能力、可以负重的能力。 手弯曲的行为有手腕弯曲、手指弯曲,手的负重行为可以有以手掌方式负重、手指方式负重。 手这个部件的能力以及其行为虽然很有限,但是配合起来可以完成俯卧撑,最终支撑并实现了人类繁衍更加重要能力的实现。
  所以,能力是可聚合的
  说到了能力的行为,行为应该可以扩展的,扩展后的行为可以做更多的之前做不到的事。比如挠痒这个行为。其实挺简单,基本的挠痒动作就是用手去抓嘛,能抓得到的地方就去抓好了。但对于抓不到的地方,那怎么办? 你至少有两种选择: 换个行为,改用"蹭",找个地方对准痒处使劲蹭.. 还是用"挠"这个行为,不过得扩展一下手,再配合使用"不求人"完成对痒处的"挠"
  所以,能力的行为是可扩展的
  刚刚提到的手的能力及其行为,都是原生的,与生俱来的。但是,我们是可以通过给人增加外挂,增加一些原本不具备的能力。比如,给眼睛配上夜视眼镜,人就具备了如猫一样可以夜视行为。 夜视眼镜的载体是眼睛,对看这个行为进行了扩展,从而使人具备夜视的能力。
  所以,某些能力不一定是原生的,是可以通过工具后叠加的
  有时候,你在某个方面可能真的很牛逼。比如,你唱歌很好、舞跳得棒、乒乓球也是一把好手。 可是如果你不去介绍自己、不在特定场合去表现自己,那么谁也不知道你有啥能力。
  所以,能力是一定是能被呈现的
  如果能理解上面的概念,那么在回过头来看Lattice中关于能力接口的定义。
  在Lattice中,我们定义了能力接口 IAbility,如下: public interface IAbility {      String getCode(); //能力编码      String getInstanceCode();      AbilityContext getContext(); //能力上下文      boolean supportChecking();//能否是否生效检查      BusinessExt getDefaultRealization(); //能力缺省默认实现      //能力执行器      R reduceExecute(ExtensionCallback callback,                            @Nonnull Reducer reducer); }
  IAbility能力中有两个关键的方法,一个是 supportChecking。 是用来检查在特定的业务约束下(bizCode),对于特定的载体,本能力是否支持?简单地打比方: 看"这个行为,去问"手"这个载体,应该得到false的结果 "看"这个行为去问"眼睛",应该得到true的结果
  另一个方法是 reduceExecute() ,他会根据能力上下文,去获取并执行特定的行为。 比如: 针对眼睛这个载体获取出 EmptyEyeRealization,那么就代表没有可用行为,比如盲人 针对眼睛这个载体取出的是基本实现 NormalEyeRealization,那么就可以完成基本看的行为 针对眼睛这个载体取出的是增强版 EnhancedEyeRealization,那么就可以完成夜视行为
  基于能力定义,实现业务叠加的样例
  环境准备
  您需要: 用于运行程序的IDE(集成开发环境),比如IntelliJ IDEA 或其类似工具; Java  Development Kit (JDK),需要JDK 8及以上版本 完成阅读:Lattice - 面向高可扩展的业务框架
  版本依赖       org.hiforce.lattice       lattice-model       1.0.8.3         org.hiforce.lattice       lattice-runtime       1.0.8.3 
  Step 1:定义团购场景 "GroupBuyProduct" 产品@Product(     code = GroupBuyProduct.GROUP_BUY_PRODUCT_CODE,      name = "Group Buy Trade Product" ) public class GroupBuyProduct extends ProductTemplate {      public static final String GROUP_BUY_PRODUCT_CODE      																			= "lattice.productGroupBuyProduct";      @Override     public boolean isEffect(ScenarioRequest request) {         if (request instanceof BuyScenarioRequest) {             boolean effect = StringUtils.equals("groupBuy",              																			((BuyScenarioRequest) request).getSource());             System.out.println("GroupBuyProduct effect status:" + effect);             return effect;         }         return false;     } }
  产品定义需要用 @Product 注解标识,同时需要继承 ProductTemplate 抽象类,并实现 isEffect 方法。团购产品的生效条件: 当前的场景是 "买家下单场景" ,即 ScenarioRequest 是 BuyScenarioRequest 如果渠道来源是 "groupBuy" ,当前产品则生效
  Step 2:团购产品实现 "自定义商品单价"扩展点
  在 《Lattice - 面向高可扩展的业务框架》,平台定义了一个 "自定义商品单价" 的扩展点。 在这里,我们让团购产品去实现这个扩展点,并假定在团购平台上,商品单价打7折。如下:@Realization(codes = GroupBuyProduct.GROUP_BUY_PRODUCT_CODE) public class GroupBuyProductExt extends BlankOrderLinePriceExt {     @Override     public Long getCustomUnitPrice(OrderLine orderLine) {         return orderLine.getUnitPrice() * 700 / 1000; //only for sample.     } }
  注:这里的价格计算只是用于DEMO,实际的价格计算不能用类型强制转换
  Step 3:构造 "买家下单场景" 的请求public class BuyScenarioRequest implements ScenarioRequest {      @Getter     private final OrderLine orderLine;      @Getter     @Setter     private String source;      public BuyScenarioRequest(OrderLine orderLine) {         this.orderLine = orderLine;     }      @Override     public OrderLine getBizObject() {         return orderLine;     } }
  Step 4:构造一次面向"买家下单场景"的业务调用过程public static void doBusiness(String source) {         OrderLine orderLine = new OrderLine();         orderLine.setUnitPrice(1000L);         orderLine.setBizCode("business.b");         try {             Long unitPrice = new BizSessionScope(orderLine) {                 @Override                 protected Long execute() throws LatticeRuntimeException {                     //bla.bla.bla                     OrderLinePriceAbility ability = new OrderLinePriceAbility(orderLine);                     return ability.getCustomUnitPrice(orderLine);                 }                  @Override                 public BuyScenarioRequest buildScenarioRequest(OrderLine bizObject) {                     BuyScenarioRequest request = new BuyScenarioRequest(bizObject);                     request.setSource(source);                     //add some other info.                     return request;                 }             }.invoke();             System.out.println("[Business B] overlay product unit price: " + unitPrice);         } catch (LatticeRuntimeException ex) {             System.out.println(ex.getErrorMessage().getText());         }catch (Throwable ex) {             ex.printStackTrace();         }     }
  一次业务调用过程,我们用 BizSessionScope 进行包装。 原因在于: 一个业务可以叠加非常多的产品;你可以想象,在电商生态中有一个AppStore,每个业务都可以从AppStore中选择并安装产品; 一次业务调用,并不是业务安装的产品都会生效,比如本例中的"团购产品",只有在下单渠道是"groupBuy"时才会生效; 一次业务调用中,我们需要过滤出本次会话实际生效的产品,并将生效的产品与业务叠加后,再进行扩展点调用以及多份扩展点实现的Reduce
  所以,BizSessionScope 会再被首次构造上,进行业务配置处理、生效的产品过滤、本次会话范围缓存初始化以及业务上下文初始化。
  Step 5:样例演示
  我们演示两次业务调用过程: 第一次业务的渠道来源是 null,商品价格就是商品单价 1000L 第二次业务的渠道来源是 groupBuy,团购平台要求商品单价必须打 7 折,产品的定制逻辑优先(这个一般是业务和平台产品签约时约定的) public class LatticeOverlayProductSample {      public static void main(String[] args) {         Lattice.getInstance().setSimpleMode(true);         Lattice.getInstance().start();          System.out.println("---------------------------------------");         doBusiness(null);         System.out.println("---------------------------------------");         doBusiness("groupBuy");         System.out.println("---------------------------------------");     }     ...... }
  运行结果如下: --------------------------------------- GroupBuyProduct effect status:false [Business B] overlay product unit price: 1000 --------------------------------------- GroupBuyProduct effect status:true [Business B] overlay product unit price: 700 ---------------------------------------
  我们可以看出,在团购产品生效时,自定义商品单价扩展点,返回的是 "团购产品" 的定制实现,即商品打了7折。
  本样例代码URL:https://github.com/hiforce/lattice-sample/tree/main/lattice-overlay-product

建议中老年人,少吃稀饭和馒头,多吃这3样食物,精力充沛一整天建议中老年人,少吃稀饭和馒头,多吃这3样食物,精力充沛一整天很多人中老年人,一大早就去锻炼遛弯,却一日三餐吃得少,还很清淡,这是不对的,无法满足身体的营养需要,长时间就会对健康有营糖尿病吃西瓜,到底是升血糖还是降血糖?或有很多人还不清楚导语夏季,人们最喜欢吃西瓜,这年头儿,虽说西瓜四季都有上市,但唯独在这个季节里让人吃得最为酣畅淋漓。但是你知道夏家吃西瓜的好处吗?爱吃西瓜的人切勿忽视,跟随小编一起来了解下吧。吃西大米粥中食物,养肾又乌发,还能起到养生,药膳的魅力喝粥自古以来就被称为是天下第一补,为什么这样说呢?中医上是这样解释的,粥有着和胃补脾益肾消肺安神消渴通便等功效,可以说几乎把人体的五脏六腑都给兼顾到了。并且会喝粥的朋友,往往不需要医生公布身体年龄计算器,不妨对照看看,你的身体老了吗?年龄是一种具有生物学基础的自然标志,通常用年岁来表示指的是一个人从出生时起到计算时止生存的时间长度。每个人从刚出生开始,年龄就在一岁一岁增加,也在慢慢走向衰老,而衰老是自然界的规律建议中老年人生活别太节俭,多吃5种高蛋白食物,身体好人一旦到了中年,身体的各个器官开始退化,稍微不注意就会引来一些小病,最重要的就是提高自身的抵抗力。只有身体健健康康的,才是这辈子最大的幸福。提高身体抵抗力不只靠锻炼,在饮食上也要吃吃猪皮能抗衰老吗?5种有助于抗衰老的食物,爱美的女性不妨多吃最近在网上看到一个讨论帖吃猪皮,到底能不能抗衰老?网友讨论的特别热烈,因为大家对它有不同的看法赞成派猪皮的营养丰富,尤其是胶原蛋白的含量极高,经常使用可以使皮肤更加有弹性,起到延缓苹果供应链转向东南亚,下一个被苹果抛弃的会是谁?一部iPhone手机,牵动着数十家中国企业,在苹果供应链上,这些公司赚得盆满钵满,但是外人不知道这要付出多少辛酸和代价。现在,随着劳动力价格上升和疫情影响,苹果将目光放到了东南亚,618手机价格大跳水,苹果13跌幅23,跟着清单买不做冤种上半年最大的两件事一个是高考一个就是618电商促销节。想必各位考生家属,都预备在此期间给孩子置办新手机笔记本等等数码设备,祝贺他们迎接新的人生。那么电商平台活动手机厂商降价幅度各有iPhone14将搭载最新黑科技,iPhone13价比老人机,买早的网友心碎之前的一系列线索告诉我们,今年的iPhone14系列包括四款机型。在iPhone14iPhone14ProiPhone14Max和iPhone14ProMax,,两种型号的专业版采苹果iPadmini6迎来新低价,64GB版降价701元,可以入手了临近618收官,许多产品都最后放出了大招,而苹果iPadmini6也在今日再迎新低价。就在今天,有媒体发现苹果iPadmini6WIFI版64GB已经降到3098元,降幅达701元涟水县外国语学校和实验幼儿园蓓蕾幼儿园联合举办幼小衔接活动幼小衔接我们在行动为深入推进幼小科学衔接,进一步贯彻落实教育部关于大力推进幼儿园与小学科学衔接的指导意见等文件精神,6月13日,涟水县外国语学校和涟水县实验幼儿园蓓蕾幼儿园共同开展
产业链条初步形成区块链正改变我们的生活区块链技术作为数字经济时代的重要底层支撑技术之一,在推动数字产业化健全完善数字经济治理体系强化数字经济安全体系中发挥着重要作用。近日,中国信息通信研究院(简称中国信通院)发布区块链机圈老司机盘点2023上半年值得关注的旗舰新机,这三款看点拉满随着2023年的到来,手机市场着实热闹了许多,各家厂商纷纷发布或者筹备着自家最新旗舰手机,用户们自然也迎来了更为丰富的选择目标。不过,面对琳琅满目的旗舰新机选择,而且上半年时间里还颜值开始走倒车?华为P60系列渲染图曝光或提供6种配色为了赶上年末换新机热潮,最近一个月各大手机接连召开新品发布会,截止目前,手机市场已经涌现了多达11款搭载骁龙8Gen2处理器的旗舰新机,带给消费者更多的可选性。值得一提的是,近期网oracle中常用的一些函数,巧用函数,减少代码量1。sign(x)功能参数x为数值型或者字符串数值型,若为正值返回1,负值回1,0返回02。floor(x)功能返回小于等于x的最大整数值3。ceil(x)功能返回大于等于x的最小新年开始就涨!多家车企宣布调价,韩系车是不想混了?2023年才开始,就有许多汽车厂家宣布要对旗下的车型进行涨价,原因不外乎是新能源补贴退坡和原材料价格上涨。当然,我们在往年或许见多了4S店的涨价,套路就是让年前没有订车的潜在客户先手机厂商售后服务对比华为苹果令人失望,真良心还得看小米!如何评价一个厂商是否真的为用户着想,除了看产品配置是否丰富价格是否良心外,售后服务同样是一项重要指标,现在的大牌手机厂商都非常注重售后,但各家厂商的政策也不一样,究竟哪家手机厂商的对话何小鹏要么足够精彩,要么轰轰烈烈死掉造车是一个后悔的哲学。采访中国企业家记者何伊凡任娅斐文任娅斐编辑马吉英图片来源中企图库很多人跟我讲,造车是一个后悔的哲学。在广州总部接受中国企业家专访时,小鹏汽车董事长CEO何小鹏都是骁龙8Gen2明星手机,小米13和一加11哪个更值?春节假期马上就要到了,搞一部各方面都出色的旗舰手机,无论是假期旅游还是宅家娱乐都非常惬意,而纵观当前的旗舰机市场,新一代骁龙8Gen2旗舰就非常香,尤其是去年上市的小米13和刚开售英特尔酷睿i913900KS上市,三星推出5纳米主控固态硬盘6GHz酷睿i913900KS上市1月12日晚上,全球首款6GHz处理器英特尔酷睿i913900KS正式开卖,京东售价5999元,活动期间评价送100元E卡,折合5899元。酷睿i过年换机只考虑苹果?便宜4000多,华为OPPO新机不输iPhone14Pro正值年前换机热潮,不少朋友都准备在过年前给自己换一台新手机。而过年期间想要记录精彩瞬间,分享自己的动态,就需要一款影像实力强大的产品,才能满足消费者的需求。也正因如此,现在手机的影医疗健康周报第1周生物制药服务商博锐生物完成超15亿元人民币战略融资生物创新疗法研发商OriCiroGenomics以8500万美元被并购(本文为钛媒体Pro(专业版)用户专享)钛媒体Pro周报通过钛媒体TMTBase全球一级市场数据库,汇总国内外一周投融资事件和热点,旨在让投资人与创业者用户,以时间数据纵深镶嵌的方