阿姨手把手教学设计模式-伊始

239 阅读9分钟

课程介绍

大家好~,我是专治胃不好的关阿姨,本教程我们来学习设计模式,保证大家学习完后药到病除,吃嘛嘛香。

说起设计模式,很多同学其实都听说过,工作中或多或少也都有接触,只不过没有系统的总结或者刻意的使用,那今天阿姨就和大家来聊聊设计模式。首先要和大家明确一点:**设计模式不依赖语言,其实设计模式,好多人称之为 " Java设计模式 ",**但其实设计模式并不是 Java 的专利,它不依赖语言,其它面向对象的编程语言,同样适用,例如 C++、JavaScript 等,这是首先要和大家明确的一点,Java 是典型的面向对象的编程语言,所以本教程以 Java 为基础来讲解设计模式。

课程内容

凡事预则立,不预则废,再开始学习一门新的课程之间,我们首先要来明确一下学习的内容及路线。

  • 设计模式七大设计原则(单一职责,接口隔离,里式替换,依赖倒置原则,开放封闭原则等)各种设计模式的基础 (即:设计模式为什么 这样设计的依据)
  • 认识UML类图以及类图六大关系(UML类图是我们后面讲解设计模式经常用到的,类图关系也是设计模式必备的知识/技能)
  • 设计模式的分类以及二十三种设计模式全面解析

本节内容目标

首先,在正式的内容开始之前,我们首先要明确以下两点

  • 为什么要学习设计模式,也就是设计模式的重要性
  • 设计模式的产生背景以及概念

为什么要学习设计模式?

阿姨带大家来先聊一聊金庸先生的《笑傲江湖》,《笑傲江湖》中的华山派两大分支:气宗和剑宗。气宗追求内力,招式练得不够好,太死板了;剑宗追求招式,又忽视内力。所以华山派才有了两大绝招《独孤九剑》和《紫阳神功》,两大绝招一起释放威力巨大。

设计模式是程序员自身修炼的宝典,敲代码就像是招式,设计模式更像是内功。就像令狐冲练了独孤九剑,在内力全无时,虽然能胜过许多二流高手,但遇到别人纯内力打击,他就扛不住了。而编程也是一样的道理,因为平时大家接到开发任务,首要目标是实现功能,而且现在的节奏~,时间紧,任务重,大家没有,可能也来不及做其他的考虑,所以,大部分程序员写的代码,其实可维护性,可读性都很差,类之间的关系非常复杂,没有条理,那例如以后要增加新的需求,现有的程序如何进行变动成本最低?如何保证新的功能模块不会对原来的项目产生影响?所以随之而来的就是设计模式,所以类似大家这样有一定工作经验的开发人员,了解以及进一步掌握设计模式是非常有必要的。

当然,设计模式,大家可以通俗理解为是前辈程序员在大量开发中累积的经验,掉了大量的头发,然后归纳为了这些设计模式,设计模式绝不是代表了绝对的开发真理,在问题面前应该灵活变通,当你的代码类结构合理, 易于维护 ,可扩展性强,那么设计模式的目的就已经达到了,切记不要过渡的使用设计模式,为了用而用。

设计模式的产生背景

设计模式最早出现在建筑领域,是克里斯托弗.亚历山大(Christopher Alexander,头衔很多的大佬) 对建筑设计中不断出现的问题, 总结出这些问题的解决方案。以后再遇到这些问题时,可以重用这些方案来解决。同样在1995年软件行业艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书,在本教程中收录了 23 个设计模式,该书在软件开发中开创了设计模式的概念,第一次将设计模式提升到理论高度,并将之规范化,导致了软件设计模式的突破。这 4 位作者在软件开发领域里也以他们的“四人组”(Gang of Four,GoF)匿名著称。

设计模式的概念

设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案,也可以理解为**设计模式是解决特定问题的套路。**

设计模式的重要性

  1. 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。
  2. 设计模式是为了让软件(程序)具有更好的代码重用性,可读性,可扩展性,可靠性

理论听着云里雾里,那到底是什么意思呢?举个栗子,何为具有更好的可靠性呢?
  • 代码重用性:即相同功能的代码,不需要多次编写,可以重复使用
  • 可读性:即编码的规范性,便于其他程序员阅读和理解
  • 可扩展性:即当需要增加新功能时,成本低,也称为可维护性
  • 可靠性:即代码强壮性,当增加新的功能时,对原有的功能没有影响
其实说到底,就是让程序呈现出高内聚,低耦合的特性(说人话..........)

内聚主要描述模块内部,耦合主要描述模块之间的关系,当然模块的粒度可大可小(小到一个类 大-到一个系统)

  • 高内聚 一个功能模块内部的元素,关联越强,则内聚越高,模块的单一性更强,一个模块应当尽可能独立完成某个功能
  • 低耦合 功能模块和功能模块之间耦合性很低,例如:T 负责两个不同的职责:职责 P1,职责 P2。当由于职责 P1 需求发生改变而需要修改类 T 时,有可能会导致原本运行正常的职责 P2 功能发生故障,也就是说职责P1和P2被耦合在了一起。例如下图,我们假设这样一个场景,发货系统发货,写入消息队列,订单系统这边订阅消息队列里的消息,如果订单系统出现故障,不影响发货系统正常写入消息队列,利用了消息中间件,两个系统之间的耦合性大大降低。

设计原则

理解了高内聚&低耦合之,那么大家有没有想过设计模式为什么 要有这样设计的依据,**其实是程序员在编程时,应当遵守的原则,也是各种设计模式的基础 。**

接下来阿姨带大家进入一个新的世界,正式进入到设计模式七大原则............................

我们先来认识一下设计模式常用的五大SOLID 原则,那SOLID 原则是什么呢?它实际上是五个设计原则首字母的缩写,它们分别是:
  • 单一职责原则(Single responsibility principle,SRP)
  • 开放封闭原则(Open–closed principle,OCP)
  • 里氏替换原则(Liskov substitution principle,LSP)
  • 接口隔离原则(Interface segregation principle,ISP)
  • 依赖倒置原则(Dependency inversion principle,DIP)
PS:这些原则并不是孤立存在的,它们相互依赖,相互补充滴。

名称

设计原则简介

重要性

单一职责原则

**首先,单一职责是由基于高内聚演化而成。**类的职责要单一,不能将太多的职责放在一个类中

★★★★☆

开闭原则

开放封闭原则:OCP(Open Close Principle)软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能

★★★★★

里氏替换原则

在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象

★★★★☆

依赖倒置原则

要针对抽象层编程,而不要针对具体类编程

★★★★★

接口隔离原则

使用多个专门的接口来取代一个统一的接口

★★☆☆☆

合成复用原则

在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系

★★★★☆

迪米特法则

一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互

★★★☆☆

设计原则和设计模式也是对系统进行合理重构的指南针,合理重构,是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。

下期预告

下一节,阿姨带大家正式进入设计模式之设计原则的学习,阿姨会用华丽丽的案例分析,来解读设计模式原则之单一职责原则,以及它的注意事项和细节,从设计模式的原则开始,一步步走进设计模式的大门~,最后,希望大家在学习的过程中能够感觉到设计模式的有趣之处,**通过阿姨的带领大家的胃口越来越好**,下期见~