前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >平时代码中用不到设计模式?Are you kidding me?

平时代码中用不到设计模式?Are you kidding me?

作者头像
静儿
发布2019-06-15 15:04:56
3940
发布2019-06-15 15:04:56
举报
文章被收录于专栏:编程一生编程一生

引子

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

应用场景

建造者模式

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

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

这一堆参数可以封装成一个有意义的类,再往下传递处理。这时候就用到了建造者模式,对参数进行封装。构造一个静态builder函数,将参数传进去,返回是一个对象。

例子如下:

这是构造一个“人”的对象。builder函数建议放到“人”这个对象里,因为这样从领域上来说更合理更清晰。

代码语言:javascript
复制
@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将对象之间做适配的例子:

代码语言:javascript
复制
  private static QuotaResponse toQuotaResponse(Quota quota) {
        QuotaResponse quotaResponse = new QuotaResponse();
        BeanUtils.copyProperties(quota, quotaResponse);
        return quotaResponse;
    }

观察者模式

数据库设计时常用的一种表结构设计方式是子母表。比如可以为“人”设计一张数据表。军人、工程师、特工有各自不同的属性,它们是“人”这张数据表的关联子表。为了展示时候的效率,将这些子母表展开,另外做一张展示表。

在写一个定时任务时,如果扫描到“人”的状态状态更新了。比如“人”的胳膊数变了,这时候可以通知这些展示表,状态都更新了。

举个例子:

因为九头蛇在街头横行,见人就砍,出现了一些残疾人。神盾局特工Fitz(菲兹)正在研制一种肢体再生技术,这个技术完成将会是包括人在内的所有动物的福音。因此,人类医院和动物医院都作为观察者都订阅了Fitz的项目状态。一旦完成,这些医院都会得到通知。

定义医院作为观察者的通用接口

代码语言:javascript
复制
public interface Observer {
    void update(boolean isFinish);
}

Fitz开放了一个attach方法,任何单位都可以实现Observer接口后通过这个方法被加入通知列表,一旦完成,Fiz将通知所有观察者:

代码语言:javascript
复制
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);
        }
    }
}

总结

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引子
  • 应用场景
    • 建造者模式
      • 适配器模式
        • 观察者模式
          • 总结
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档