平时我是个反应很是慢的人。有多慢呢?大概是两年前有次团队内部开会时,我听到同窗说平时代码中用不到设计模式,我当时没有回答。两年后我终于反应过来了:“Are you kidding me?我天天都在用!”java
写一个接口,入参是一大堆,什么都有。这是长期积累下来的代码,参数都提供给外部用了。只能作加法,不能作减法。这时候接口就这样了,内部能不能好看点呢?mysql
能够啊,重构,留壳抠瓤啊!sql
这一堆参数能够封装成一个有意义的类,再往下传递处理。这时候就用到了建造者模式,对参数进行封装。构造一个静态builder函数,将参数传进去,返回是一个对象。数据库
例子以下:编程
这是构造一个“人”的对象。builder函数建议放到“人”这个对象里,由于这样从领域上来讲更合理更清晰。设计模式
@Data @Accessors(chain = true) public class Person { private String name; private int armCount=2;//胳膊数默认为2 private int legCount=2;//腿数默认为2 private Person(String name) { this.name = name; } public static Person builder(String name) { return new Person(name); } }
你们如今用mysql都喜欢用mybatis-generator工具自动生成部分代码。里面的对象通常称为领域对象。在上层给用户返回结果的时候通常不直接用。由于信息太多了。好比数据库中固定结构的字段:建立时间、更新时间、是否为逻辑删除列这些,更好的一个方式是对外不可见。这时候就要对领域对象和传输层对象之间作一个转换,这时候用到适配器模式。mybatis
下面是使用BeanUtils将对象之间作适配的例子:数据库设计
private static QuotaResponse toQuotaResponse(Quota quota) { QuotaResponse quotaResponse = new QuotaResponse(); BeanUtils.copyProperties(quota, quotaResponse); return quotaResponse; }
数据库设计时经常使用的一种表结构设计方式是子母表。好比能够为“人”设计一张数据表。军人、工程师、特工有各自不一样的属性,它们是“人”这张数据表的关联子表。为了展现时候的效率,将这些子母表展开,另外作一张展现表。函数
在写一个定时任务时,若是扫描到“人”的状态状态更新了。好比“人”的胳膊数变了,这时候能够通知这些展现表,状态都更新了。工具
举个例子:
由于九头蛇在街头横行,见人就砍,出现了一些残疾人。神盾局特工Fitz(菲兹)正在研制一种肢体再生技术,这个技术完成将会是包括人在内的全部动物的福音。所以,人类医院和动物医院都做为观察者都订阅了Fitz的项目状态。一旦完成,这些医院都会获得通知。
定义医院做为观察者的通用接口
public interface Observer { void update(boolean isFinish); }
Fitz开放了一个attach方法,任何单位均可以实现Observer接口后经过这个方法被加入通知列表,一旦完成,Fiz将通知全部观察者:
public class Fitz { private List<Observer> observers = new ArrayList<Observer>(); public void attach(Observer observer) { observers.add(observer); } public void finish() { notifyAllObservers(); } public void notifyAllObservers() { for (Observer observer : observers) { observer.update(true); } } }
代入思考,技术提高的关键
一线开发十二年,有日本东京和美国硅谷研发经验。有百余项技术发明专利,目前任美团点评技术专家。有本身的技术公众号「编程一辈子」。若是您在阅读文章时有什么疑问或者发现文章的错误,欢迎在公众号里给我留言。