使用场景
处理步骤组合,存在灵活多变
类似
责任链
招式
定义context上下文,
处理context的handler接口
定义一个Executor执行一个List顺序的责任链
求其上,得其中;求其中,得其下,求其下,必败
单一性原则要求一个对象/类应该只有一个变更的原因。但是在这个案例里,代码可能会因为任意一个外部依赖或计算逻辑的改变而改变。
依赖反转原则要求在代码中依赖抽象,而不是具体的实现。在这个案例里外部依赖都是具体的实现,比如YahooForexService虽然是一个接口类,但是它对应的是依赖了Yahoo提供的具体服务,所以也算是依赖了实现。同样的KafkaTemplate、MyBatis的DAO实现都属于具体实现。
开放封闭原则指开放扩展,但是封闭修改。在这个案例里的金额计算属于可能会被修改的代码,这个时候该逻辑应该需要被包装成为不可修改的计算类,新功能通过计算类的拓展实现。
多使用策略模式扩展
COLA框架,搭建分层模型
业务内聚,分而治之
APP层可先厚,再做薄
1)实体
唯一标识,具备生命周期,包含业务关键行为
包含实体相关的方法,实体对象可以包含接口(接口可注入),实体建议使用工厂模式创建2)值对象
只关系属性,没生命周期。
避免大量对象为实体,从而需要唯一标识,唯一标识会带来数据库主键之间关系网庞大。3)领域服务
属于领域业务,但非实体对象本身的逻辑。
多领域对象计算,业务动作,领域对象转换等均可定义为领域服务。4)聚合
将实体和值对象进行聚合
形成业务内聚。
如何聚合根:
1)生命周期一致
2)问题域一致性
3)场景频率一致性
4)聚合内的元素尽可能少
如何割断值对象
1)引入Id值对象
2)使用ORM框架的LazyFetch机制(注意生命周期范围)
3)引入Supplier的get延迟机制
实体的创建最好走工厂模式/builder模式
实体的变更需要走唯一gateway/Repository模式
实体的查询走CQRS模式,注重效率即可
值对象的变更,查询随意,不受约束。
使用mongodb文档型数据库
使用聚合根快照概念
https://github.com/meixuesong/aggregate-persistence
关系数据库,实体持久化可以灵活,一个实体多表(值对象占表),或者一实体一表
利用 mapstruct
https://blog.csdn.net/significantfrank/ COLA框架
https://developer.aliyun.com/article/713097?spm=a2c6h.13262185.profile.12.1ea36c7btzXxqf DDD落地
https://zhuanlan.zhihu.com/p/436465508 DDD落地
https://blog.csdn.net/qq_33589510/category_10734882.html DDD系列
##用途##
创建复杂对象:
1.需要根据配置文件。2.spring运行环节期间创建对象。
3.符合spring设计理念
##例子##
EhCacheFactoryBean
MybatisSqlSessionFactoryBean
1.在实例化时存在校验,不希望后续属性再次被修改(逃避校验)
2.存在多线程使用场景,不希望此代码运行对对象进行修改(事件对象,HTTPclient参数)
DTO类,被快速GC
1 | @SuperBuilder |
https://juejin.cn/post/6844903586661400590
https://www.cnblogs.com/shoshana-kong/p/10822759.html
https://www.codenong.com/32989562/
无论何时,只要你能做到,就应该尽量使用泛型方法
1.把容器类泛型化
2.接口实现泛型
3.方法参数泛型
各类方法,类的参数的类型,参数化,不再是具体类型,而是一个泛化的类型
1 | //此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 |
1 | /** |
1 | /** |
kafka:2.13-2.6.3 前面为scala版本后面为kafka版本
一定确定,kafka服务端版本和客户端版本,和zk的关系
参考:https://zhuanlan.zhihu.com/p/359573455
相对稳定版本:2.6.1 +
强烈建议docker compose部署,非以下模式
ZK部署
1 | docker run -d --name zookeeper-zq \ |
kafka部署
1 | docker run -d --name kafka -p 9092:9092 -p 9094:9094 -e KAFKA_BROKER_ID=0 \ |
KAFKA_ZOOKEEPER_CONNECT 参数后面不要加路径,避免众多kafka工具不支持自定义路径。
kafka-eagle
1.力量的动画阶段(这个阶段表明很容易被强壮的男人吸引)
2.行为的动画阶段(这一阶段表明容易被行动能力强的男人吸引)
3.语言的动画阶段(这一阶段表明很容易被能很好使用语言的男人吸引)
4.有意义的动画阶段(这个阶段表明很容易被像精神领袖这样的男性形象所吸引)
物质的需求会同上面不同的阶段保持并驾齐驱。
1.生理需求
2.当全世界都抛弃他,而你会对他不离不舍的笃定(不需要真的发生,发生了他还会设身处地为你着想)
催产素的愿景,自己的子女的成长,家庭感。(不一定每个人都有这样的需求)
对方有强壮的身体,娇好的外貌,实则内在原驱力,这种显而易见的的优势,能提高下一代的基因。(如果不需要下一代,其实似乎也没那么重要)
一个人的自由两个人的快乐,如果鱼和熊掌不能同时兼得,考虑下顺序。
不谈物质条件都是不切实际的,太讲究条件对等,需要承担后期条件的置换变化
(比如男提供 房,车,豪华婚礼,女提供生育
后期女人老珠黄,男外遇,这种事情现代社会太多,是否属于条件随时间变化的不对等呢?
)懂的37% 法则,如果你淘汰了太多选项,也学会接受现在这个不比之前好的现状