• Asura
    置顶
    2020-05-14
    写得真好 想问下项目里用到不同设计模式 类的命名规范 以及放置这些设计模式的包的命名规范是怎么样的

    作者回复: 包名没有规范,涉及到设计模式类名可以以 Locker Iterator Extractor Accessor Validator Formatter Converter Replacer Comparer Manager Combiner Parser Encoder Decoder Importer Exporter Editor Modifier Evaluator Locator Creator Initializer Reader Writer Activator Finder Builder Selector Visitor Loader Descriptor Generator Adapter Listener Wrapper Mapper Binder Invoker Executor Detector Tracer Decorator Mapper Resolver Processor Advisor Dispatcher Consumer Producer Publisher Subscriber Handler Filter Interceptor Provider Container 单词作为前后缀 以提现类作用或者模式

    共 4 条评论
    99
  • 待时而发
    置顶
    2020-05-02
    太实用了 老师。我还真的在日常开发中碰到过太多您所提到的这些问题了,而且很多

    作者回复: 有收获就好

    
    24
  • Darren
    2020-05-05
    一、观察者模式的在Spring中的使用:spring listener就是基于观察者模式的:主要是三个组件: 1. 事件,需要继承ApplicationEvent,即观察者模式中的"主题",可以看做一个普通的bean类,用于保存在listener的业务逻辑中需要的一些字段; 2. 事件listener,需要实现ApplicationListener<E extends ApplicationEvent>,即观察者模式中的"观察者",在主题发生变化时收到通知,并作出相应的更新,加泛型表示只listen某种类型的事件; 3. 事件发布器,需要实现ApplicationEventPublisherAware,获取spring底层组件ApplicationEventPublisher,并调用其方法发布事件,即"通知"观察者。 二、Bean 属性复制,原理肯定是反射了,其实自己实现也很简单,或者反射或者内省,内省实现最简单,以前使用内省实现过。现在主要是用hutool,超级好用的工具包,里面基本你想要的工具类都有,欢迎大家使用https://hutool.cn/

    作者回复: 感谢分享

    共 3 条评论
    43
  • cky.宇
    2020-08-15
    十分感谢老师的分享,感觉干货十足,收获很多。 这里补充一个项目也经常用到的策略模式,以老师的银行数值格式化的代码为例: switch (bankAPIField.type()) { case "S": { stringBuilder.append(String.format("%-" + bankAPIField.length() + "s", value.toString()).replace(' ', '_')); break; } // ... } 可以转为基于枚举的策略模式 enum BankAPIFieldType { S { @Override public String format(Object value, BankAPIField bankAPIField) { return String.format("%-" + bankAPIField.length() + "s", value.toString()).replace(' ', '_'); } }, // ... ; public abstract String format(Object value, BankAPIField bankAPIField); } 将BankAPIField的type类型限制为BankAPIFieldType public @interface BankAPIField { int order() default -1; int length() default -1; BankAPIFieldType type() default BankAPIFieldType.DEFAULT; } 然后调用的时候就可以简化为: stringBuilder.append(bankAPIField.type().format(value, bankAPIField)); 这样做一个是可以限制type的值范围,防止传入的string错误。另一个是减少了主干逻辑的代码,会更清晰点。
    展开

    作者回复: 不错

    共 5 条评论
    25
  • Jerry Wu
    2020-05-07
    这篇文章、demo值得看几十几百遍,感觉打通了任督二脉。 以前学过设计模式、Java的高级特性,但只能算看过,完全不知道怎么用在工作。 看完这篇文章才发现,代码还能这样写。刚好,公司有一大堆乱七八糟的代码,实践的时候到了。

    作者回复: :)

    共 4 条评论
    19
  • 👽
    2020-05-12
    购物车的例子,我个人理解,Java8中,可以使用接口以及default来代替抽象类。我认为使用接口更好,因为接口可以多实现,但是抽象类不可多继承。

    作者回复: 也不能完全替代,抽象类可以有状态,而且接口语义上是can-do,抽象类是is-a,还是选择更符合语义的方式来实现比较好

    共 2 条评论
    16
  • 程序员小跃
    2020-07-24
    开篇这些问题,不就是我遇到的问题吗,老师来的太及时了。今天还和朋友聊到设计模式的辩论,有用还是无用,看了这篇文章,我心里又有底了。优秀程序员进阶,走起

    作者回复: 奥利给

    
    7
  • Sky1225
    2021-07-30
    BeanUtils不推荐使用,这个工具是在运行时转换的,遇到同名不同类型的字段不会转换,而且没有错误提示,可能会有坑,推荐使用mapstruct,这个是在编译器生成转换代码,对于普通类型会自动转换(如int和String),对于不能自动转换的会有错误提示,且能看到生成的代码

    作者回复: 没错 答疑中我也提到

    
    6
  • FelixFly
    2020-05-12
    1. 松耦合的方式一般都是用于消息发送,比如说短信发送、日志推送等等,消息队列是分布式中的松耦合 2. Bean 属性复制:https://www.jianshu.com/p/40e0e64797b9 这篇文章基本全了

    作者回复: 感谢分享

    
    5
  • insight
    2020-05-02
    想问一下老师,属性拷贝工具相较于直接写get和set,会有性能上的差异嘛?

    作者回复: 会有 不过一般不会存在性能瓶颈

    共 3 条评论
    4