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

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

引子


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

 

应用场景


建造者模式


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


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


1112728-20190612093731580-103196938.png


这一堆参数可以封装成一个有意义的类,再往下传递处理。这时候就用到了建造者模式,对参数进行封装。构造一个静态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<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);
        }
    }
}


总结


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


相关文章
|
6天前
|
设计模式 存储 Java
23种设计模式,备忘录模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。
35 0
|
6天前
|
设计模式 前端开发 API
写出易维护的代码|React开发的设计模式及原则
本文对React社区里出现过的一些设计模式进行了介绍,并讲解了他们遵循的设计原则。
|
6天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
6天前
|
设计模式 算法 Java
23种设计模式,访问者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】访问者模式是一种将算法与对象结构分离的设计模式。这种模式主要用于执行一个操作(或一组操作)在一个对象结构的各元素上,它可以在不修改各元素的类的前提下定义新的操作。
23 2
|
6天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
20 0
|
6天前
|
设计模式 算法 搜索推荐
23种设计模式,策略模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】设计模式是软件工程中的一种最佳实践指导,用于解决常见的设计问题。它们被分类为创建型、结构型和行为型模式。其中,策略模式是一种行为型设计模式,旨在定义一系列算法,封装每一个算法,并使它们可互换。策略模式允许算法独立于使用它们的客户端变化
28 2
|
6天前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
30 4
|
6天前
|
设计模式 Java
23种设计模式,观察者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
29 2
|
6天前
|
设计模式 Java
23种设计模式,中介者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第8天】中介者模式是一种行为设计模式,它通过一个中介对象来封装一系列对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
38 8
|
6天前
|
设计模式 Java
23种设计模式,迭代器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第8天】迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露该对象的内部表示。它主要用于遍历集合对象(如列表、树等)。
27 9