博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
平时代码中用不到设计模式?Are you kidding me?
阅读量:6700 次
发布时间:2019-06-25

本文共 2039 字,大约阅读时间需要 6 分钟。

引子

平时我是个反应非常慢的人。有多慢呢?大概是两年前有次团队内部开会时,我听到同学说平时代码中用不到设计模式,我当时没有回答。两年后我终于反应过来了:“Are you kidding me?我每天都在用!”

 

应用场景

建造者模式

写一个接口,入参是一大堆,什么都有。这是长期积累下来的代码,参数都提供给外部用了。只能做加法,不能做减法。这时候接口就这样了,内部能不能好看点呢?

可以啊,重构,留壳抠瓤啊!

 

这一堆参数可以封装成一个有意义的类,再往下传递处理。这时候就用到了建造者模式,对参数进行封装。构造一个静态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工具自动生成部分代码。里面的对象一般称为领域对象。在上层给用户返回结果的时候一般不直接用。因为信息太多了。比如数据库中固定结构的字段:创建时间、更新时间、是否为逻辑删除列这些,更好的一个方式是对外不可见。这时候就要对领域对象和传输层对象之间做一个转换,这时候用到适配器模式。

 

下面是使用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
observers = new ArrayList
(); public void attach(Observer observer) { observers.add(observer); } public void finish() { notifyAllObservers(); } public void notifyAllObservers() { for (Observer observer : observers) { observer.update(true); } }}

总结

代入思考,技术提升的关键

 

推荐阅读

 

关于作者

一线开发十二年,有日本东京和美国硅谷研发经验。有百余项技术发明专利,目前任美团点评技术专家。有自己的技术公众号「编程一生」。如果您在阅读文章时有什么疑问或者发现文章的错误,欢迎在公众号里给我留言。

转载于:https://www.cnblogs.com/xiexj/p/11007779.html

你可能感兴趣的文章
字符驱动之按键(四:poll机制)
查看>>
现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数...
查看>>
山区建小学
查看>>
[javascript|基本概念|Number]学习笔记
查看>>
JSP EL表达式使用
查看>>
连接SQL Server数据库
查看>>
JAVA_Thread_deadlock
查看>>
中小企业网络安全提升
查看>>
[ZJOI2010]贪吃的老鼠
查看>>
爆栈的处理方法
查看>>
大院大所合作对接会7天倒计时!亮点抢先看
查看>>
[已授权] 互联网定位技术小谈
查看>>
Oracle执行计划解释
查看>>
11.8 开课二个月零四天 (Jquery)
查看>>
javaScript复习
查看>>
博弈论之Nim游戏
查看>>
3DMed
查看>>
ZEN CART 在LINUX系统下设置邮箱方法---用GMAIL设置,方法选择SMTPAUTH
查看>>
ofstream的使用方法--超级精细。C++文件写入、读出函数(转)
查看>>
DOM剪切板
查看>>