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

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

美国的台湾牌还能打多久?打不打是一回事,有没有实力打是另外一回事。有而不打是仁慈,打而没有是悲哀。8月4日12时起,解放军将在台湾岛周边海域和空域进行重要军事演训行动,并组织实弹射击。台湾军事部门3日称解毛主席和蒋介石,都在对方弱势时愿意给其一职务,具体是啥职位毛主席是我党的领袖,蒋介石是继孙中山先生之后的国民党的第二任领袖。两人为了我们民族大业,在抗日战争期间合作抗日。同时,因为所选的道路不同,又斗争了很多年。毛主席和蒋介石,都很尊重对浙江单身汉,家中排行第13,41岁收养路边女婴,5年后悲剧发生了2022年春节,在浙江丽水市遂昌县的一个小村庄,一位未婚的中年男子从集市上买来了一件漂亮的公主裙,在除夕夜晚上径直走向了自己年仅5岁的女儿的墓地。这位农民叫做林在喜,她的女儿叫做林经济日报携手京东发布数据来源经济日报数据来源京东消费及产业发展研究院创新让节日更浪漫七夕作为中国传统的情人节,在消费侧有着重要地位。一方面,七夕已经成为重要消费节点,无论是重点品类的销量还是销售额都在逐年恕我直言没有男生可以拒绝微胖的女生?漫画带你查看缘由现如今是一个看颜值的时代,很多女孩为了拥有完美的身材,所以加入了减肥的行列,但是这种减肥他们只经常挂在嘴边,却没有付出行动,当看到别人小蛮腰小细腿,小V脸就是羡慕不得了了。现如今人台积电董事长刘德英,为何会放大台积电的存在感,抵制大陆武统?中国东部战区的海陆空围岛的军事演习,是因为美国众议院议长佩洛西窜访台湾一事引起的,中国内政受到了台独势力的挑战,中国人民情忍无可忍,才借着演习发泄心中的怒吼!台积电董事长刘德音,作王思聪现身成都,和五个女生吃饭,网友好巧啊,王老师王思聪现身酒吧喝酒,长发美女心情好,逛奢侈品店偶遇。王思聪和五个女生吃饭是偶然认识的,都是高颜值,一起默默吃饭。近日,有网友在成都一家平价餐厅偶遇王思聪。画面中,王思聪坐在主位,身演技惊人却被长相拖累,5位一脸凶相的女星,几乎演不了好人在很多人的印象中,演员总是千人千面,尤其是那些演技出色的演员们,总是会给观众带来完全不同的观赏体验。不过,演员终究也是普通人,这其中,有不少女星尽管演技十分出色,可偏偏受限于一脸凶2008年,中国第一巨人鲍喜顺,不顾医生劝阻生下儿子,如今怎样了他是中国第一巨人,比姚明还高10厘米,身高2。36米,却因此自卑单身到56岁。一夜成名后娶小28岁妻子又生子,中国第一巨人鲍喜顺现在怎么样了?鲍喜顺巨人身高无数人看到鲍喜顺的第一眼以下五句话,聪明的人烂在肚子里,糊涂的人逢人就说01hr宁愿无话,也别无话不说。人活着,无法避免与人打交道,那就避免啰里啰嗦。聪明的人,揣着明白装糊涂糊涂的人,天上知道一半,人间知道全部,聪明反被聪明误。法言问神里写道言,心声也微信又出新功能?微信爱心气泡主题皮肤,一整屏都是爱你的形状众所周知,微信是拥有庞大用户体系的,可玩性也不低,平时小雷也分享过跟多针对微信的玩法教程。最近小雷就在琢磨,以前玩QQ的时候吧,都会有很多好看的皮肤或者主题可以轮换。可为啥微信发展
内存降价更显产品超值,毁灭者DDR43200MHz高频内存真香!从22年末开始,硬件价格就对DIYer非常友好啦,装机嘛,大部分显卡都已经破发,内存条和SSD硬盘价格也在下探,尤其是固态硬盘,一些品牌型号甚至出现了腰斩的情况。我之前买的1TB三文化圣地好客山东江北水乡运河古城枣庄市寻梦台儿庄只为遇见你看岱青海蓝景色美,闻齐风鲁韵文化汇,泰山矗立,黄河入海。孔孟在这里诞生,长城在这里始建,运河在这里重现,这就是好客山东。今天介绍的这座小城,有可以翻墙的老街,有可以结伴嬉戏玩耍的河望岳谈从人均生产总值11万,读懂山东的温度和底气山东省政府工作报告提出,到2027年,综合实力大幅跃升,高质量发展主要指标走在前列,人均生产总值达到11万元。11万元,这是一个怎样的数字?经济学中,人均GDP是衡量经济发展状况的雅培奶粉告别中国,国产品牌逆袭外资巨头?雅培在美国密歇根州的工厂。(视觉中国图)全球四大奶粉巨头中,已有一家决定撤离一家本土化运营中国婴幼儿奶粉市场。继2021年6月,春华资本以22亿美元的价格接盘美赞臣大中华区业务后,年度特稿卧龙区招商引资栽树工程为发展添动能全媒体记者陈向革张空陈辉2022年,南阳市卧龙区招商引资工作按下快进键,总投资165亿元的豫资海元南阳城市产业综合体总投资56亿元的江苏超电新能源动力电池生产线总投资50亿元的预制广东宏远的老带新培养新人模式,各队赶紧来抄作业吧!广东宏远能够保持长盛不衰,大家都知道原因,在于它的人才不断档。这场对阵北控的比赛,广东宏远把它的老带新传统展露无遗,就看其他队能不能抄好作业了。我们先来看一组数据球员上场时间易建联山东省软件名园名单公示!威海一园区入围近日,省工业和信息化厅公示了山东省软件名园名单,全省共有11家园区入围,其中综合型名园4家,特色型名园7家,威海市高新区科技孵化园入围特色型名园。近年来,威海市高度重视软件与信息服贵州雅友新材料有限公司总经理李智军为实现矿产资源化产业化转型升级不懈奋斗1月12日,走进位于贵州省黔南州瓮安县经开区的贵州雅友新材料有限公司(以下简称贵州雅友),已建好投产的一期10万吨磷酸铁项目正快速运转生产二期20万吨磷酸铁项目建设现场,工人们则正ebike储能火热的2022年,资本却还在寻找下一个SHEIN?头条创作挑战赛今年融资盘点文章的关键词,貌似还是SHEIN?在2023年的开始,除了展望新的一年,也要对过去的一年做复盘。过去一年笔者持续关注跨境电商,因此借此机会也对过去一年跨境20232029全球及中国阻垢缓蚀剂行业研究及十四五规划分析报告辰宇信息咨询市场调研公司最近发布20232029全球与中国阻垢缓蚀剂市场调研报告内容摘要本文同时着重分析阻垢缓蚀剂行业竞争格局,包括全球市场主要厂商竞争格局和中国本土市场主要厂商竞收评沪指周线3连阳靠近3200点北向资金开年净买入超640亿元金融界1月13日消息美国通胀继续回落,周五A股三大指数全线高开,早盘沪指深成指震荡上行,同时上证50指数持续走高涨超1,创业板指则整体呈震荡态势,午后北向资金加速进场,三大指数尾盘