做一个不复制粘贴的程序员[1]: 使用模板方法模式(2)- 对象更新比较器实例

 文章目录

一、场景描述
二、蹩脚的方法
三、模板方法
四、结语

在进入正题之前,说一些废话,谈谈对于我的前一篇文章被移出博客园首页的想法。不谈我对于其他首页文章的看法,光从我自身找找原因。下面分析下可能的原因:

  1. 篇幅太短:我觉得篇幅不能决定文章的质量,要说清楚一个问题,肯定字数越少越好
  2. 代码过多,文字太少:Talk is cheap. Show me the code. 我觉得code比talk更有说服力,而且大多数程序员相对更喜欢看代码。我觉得我的代码说的比我文字说的好(相对而言,我没说我代码写的好 : ) )
  3. 质量不行:只有我觉得能给大家启发的我才会选择发布到首页。上篇文章的例子是我实际工作中遇到的问题,思考出来并且经过时间、实践检验的东西

不给自己找理由,我承认自己水平有限、能力不足,希望自己以后努力能达到要求,欢迎大家在评论区和我交流。

在前一篇文章中,我已经用分页查询的实例,说明了如何用模板方法模式去消除代码重复。那个例子相对比较简单,下面分享一个稍微难一点的例子,加深大家的理解。

一、场景描述

说一个我工作中遇到的场景,有一个消息队列(MQ)监听上游系统推送过来的消息,只对接数据库表中的几个字段,大概流程如下:

  1. 先根据唯一键去查询数据库中是否存在,如果不存在则插入一条新记录
  2. 如果存在,则对比上游推送的对象和数据库查出来的对象,比较对接的那些字段是否相同
  3. 如果都相同,就什么都不操作。如果有不同的,就用那不同的字段去更新数据库中的记录

二、蹩脚的方法

假设和上游系统对接的是用户模块,用户表中有id、name、age、sex四个字段,id是唯一键,现在只要对接id、name、age四个字段。

@Data @NoArgsConstructor @AllArgsConstructor public class User {     private Integer id;     private String name;     private Integer age;     private Integer sex; }
public class UserDAO {     private User oneUser = new User(1, "u1", 18, 1);      public User getById(Integer id) {         if (id != 1) {             return null;         }         return oneUser;     }      public void updateById(User user) {         Integer id = user.getId();         if (id == null || id != 1) {             return;         }         if (user.getName() != null) {             oneUser.setName(user.getName());         }         if (user.getAge() != null) {             oneUser.setAge(user.getAge());         }         if (user.getSex() != null) {             oneUser.setSex(user.getSex());         }     } }
    /**      * 对比两个对象,获取用于更新的对象      *      * @param toUpdate 要更新的对象      * @param original 原来的对象      * @return 用于更新的对象。如果要比较的字段都一样则返回null      */     private User getUserUpdate(User toUpdate, User original) {         User updateUser = new User();         if (!original.getName().equals(toUpdate.getName())) {             updateUser.setName(toUpdate.getName());         }         if (!original.getAge().equals(toUpdate.getAge())) {             updateUser.setAge(toUpdate.getAge());         }         if (Stream.of(updateUser.getName(), updateUser.getAge())                 .allMatch(Objects::isNull)) {             // 没有更新             return null;         }         return updateUser;     }

MQ监听的方法

                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信