送你一份设计模式入坑指南!写出诗一样的代码

231 阅读6分钟


写在前面

今天开通了「设计模式」系列,和大家一起学习设计模式,加深我自己记忆的同时,也希望能给大家带来一些帮助,毕竟只有我的文章大家都能看懂,才证明我真正学废(会)了。

什么是设计模式?

设计模式(Design Pattern):是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。注意,它并不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。

1995年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称『GoF设计模式』。

为什么要学设计模式?

当我们回头看半年前或者一年前自己写的代码时,我们会发现:这谁写的代码?写得这么烂?啪啪打脸。

我觉得主要原因有两个:

其一,刚接触代码不久,对于刚刚学习编程的小伙伴来说,编码还不熟练,要写出雷军那样“像诗一样优雅”的代码,显然不太现实,哈哈。

其二,是因为我们没有学习设计模式,设计模式是软件设计中常见问题的典型解决方案,如果不懂的话,那编码过程中就比较难受了。

设计模式是前人软件设计智慧的结晶,学习设计模式重在理解它的思想,设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系充分理解。

学习设计模式有这几个优点:

  • 可以提高程序员的思维能力、编程能力和设计能力。

  • 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件开发周期。

  • 让代码可复用性高、可读性强、可靠性高、灵活性好、可维护性强。

一直以来,我们都在使用别人设计好的框架、工具类、库等,利用它们的 API 编写我们的程序,但是普通的工具类是没有办法把我们的程序组织成一个代码复用性高、可读性强、灵活性好、具有弹性的结构。也正因为如此,才出现了越来越多的集成式框架,比如说 Spring、Mybatis 等。这些框架很好地帮我们处理好了这些问题,因为它们本身都使用了设计模式。所以在开发中,设计模式是很重要的,非常有必要把它学懂。

雷军说过:我没有写过诗,但是有人说我写过的代码,像诗一样优雅。

说白了,设计模式越熟练,写出来的代码就更优雅,阅读起来就很舒服,可维护性、可扩展性就更强。

设计模式分类

不同设计模式的复杂程度和应用范围等各方面都不相同,所以可以根据模式的目的来进行分类。主要分为以下三种:

  • 创建型模式:提供创建对象的机制,用于描述“怎么创建对象”,主要特点是“将对象的创建与使用分离”。

    提供了「单例、原型、工厂方法、抽象工厂、建造者」等 5 种创建型模式。

  • 结构型模式:介绍如何将对象和类组装成较大的结构。

    提供了「代理、适配器、桥接、装饰、外观、享元、组合」等 7 种结构型模式。

  • 行为型模式:负责对象间的高效沟通和职责委派,也就是用于描述类或对象之间怎样相互协作完成单个对象都无法单独完成的任务,以及怎样分配职责。

    提供了「模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器」等 11 种行为型模式。

OOP七大原则

上文提到了面向对象设计原则,也说了设计模式是对设计原则的应用,到底有哪些原则呢,一起来看看。名词记不住不要紧,尽量用通俗易懂的解释来帮助理解。

  • 开闭原则:对扩展开放,对修改关闭

    当我们的应用程序有新需求时,我们尽量不去修改原来的代码,而是基于这个代码来进行扩展。这就是所谓的对扩展开放,对修改关闭。

  • 里氏替换原则:继承必须确保超类所拥有的性质在子类中依然成立

    拿 Java 中的继承来举例,我们尽量不要在子类中更改从父类继承的方法,而是尽量添加新的方法完成新的功能,如果重写父类方法的话,可复用性就会变差,在后期各种模式的详细讲解中也会举例说明原因。

  • 依赖倒置原则:要面向接口编程,不要面向实现编程

    模块之间不能相互依赖,而是依赖它们的抽象,模块的细节应该基于接口来实现,使用抽象类可以用来指定约束和规范。

  • 单一职责原则:控制类的粒度大小、将对象解耦、提高其内聚性

    可以简单理解为类中的方法只做一件事情,避免多个功能堆在一起,降低耦合。

  • 接口隔离原则:要为各个类建立它们需要的专用接口

    其实就是把接口拆分成更小的接口,和单一职责原则一样都是为了将对象解耦,提高内聚性。

  • 迪米特原则:只与你的直接朋友交谈,不跟“陌生人”说话

    一个对象其他对象知道的越少越好,只和朋友通信,不和陌生人说话。

  • 合成复用原则:尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现

    组合是“有一个”,继承为“是一个”,通常“有一个”可能比“是一个”更好。


另注: 本文在开源项目: github.com/MujieJava/JavaStudy 中已收录,包含计算机基础技术文章、资源干货等,资源持续更新中...

我是木节,觉得这篇文章对你有帮助的话,可以来个点赞 + 关注,下期再见!