设计模式

文章目录
  1. 1. 除了“设计模式”,你还应该知道什么
  2. 2. 设计模式从何而来
  3. 3. 软件设计模式的种类
  4. 4. 软件设计模式有什么用?
  5. 5. 如何学好设计模式
  6. 6. 关于语言
  7. 7. 设计模式总览
    1. 7.1. 创建型模式(Creational)
    2. 7.2. 结构型模式(Structural)
    3. 7.3. 行为型模式(Behavioral)
  8. 8. 面向对象设计原则

除了“设计模式”,你还应该知道什么

程序员内功之设计模式🔥

推荐学习视频C++常用设计模式

设计模式从何而来

四人组(Gang of Four),简称GoF.

GoF将模式的概念引入软件工程领域,这标志着软件模式的诞生。软件模式(Software Pattern是)是将模式的一半概念应用于软件开发领域,即软件开发的总体指导思路或参照样板.

需要了解软件模式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等。

“软件设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可充用代码,让代码更容易被他人理解并且保证代码可靠性。”

——软件设计模式的定义

一句大白话就是:“在一定环境下,用固定套路解决问题”。

软件设计模式的种类

GoF提出的设计模式有23个,包括:

  • 【设计模式】创建型模式(Creational):如何创建对象;

    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。

    1. 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。

    2. 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。

    3. 工厂方法(FactoryMethod)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。

    4. 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。

    5. 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。

  • 【设计模式】结构型模式 (Structional):如何实现类或对象的组合;

    结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。

    由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。

    结构型模式分为以下 7 种:

    1. 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
    2. 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
    3. 桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现这两个可变维度的耦合度。
    4. 装饰(Decorator)模式:动态地给对象增加一些职责,即增加其额外的功能。
    5. 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
    6. 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。
    7. 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
  • 【设计模式】行为型模式(Behavioral):类或对象怎样交互以及怎么分配职责。

    行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。

行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。

行为型模式是 GoF 设计模式中最为庞大的一类,它包含以下 11 种模式。

  1. 模板方法(Template Method)模式:定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
  2. 策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
  3. 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
  4. 职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
  5. 状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力。
  6. 观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
  7. 中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
  8. 迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
  9. 访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
  10. 备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
  11. 解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。

以上 11 种行为型模式,除了模板方法模式和解释器模式是类行为型模式,其他的全部属于对象行为型模式。

设计模式目前的种类:GoF的23种 +“简答工厂模式” = 24

软件设计模式有什么用?

有助于更加深入地理解面向对象思想,让你知道:

1. 如何将代码分散在几个不同的类中
2. 为什么要有“接口”
3. 何为针对抽象编程
4. 合适不应该使用继承
5. 如何不修改源代码增加新功能
6. 更好地阅读和理解现有类库与其他系统中的源代码

如何学好设计模式

设计模式的基础是:多态,参考书上给的建议就是:

初学者:积累案例,不要盲目的背类图(我就是)

初级开发人员:多思考,多梳理,归纳总结,尊重事物的认知规律,注意临界点的突破,不要浮躁。

中级开发人员:合适的开发环境,寻找合适的设计模式来解决问题。多应用,对经典的组合设计模式,大量自由的运用,要不断地追求。

关于语言

语言是基础,学习设计模式之前一定要对自己现在使用和运用的语言加以了解;熟悉、掌握多态。

C学习者建议可以读一遍《c Primer Plus》,尤其是面向对象部分

设计模式总览

创建型模式(Creational)

创建型模式

结构型模式(Structural)

结构型模式

行为型模式(Behavioral)

行为型模式

面向对象设计原则

名称 定义
单一职责原则
(Single Responsibility Principle,SRP)
⭐️⭐️⭐️⭐️
类的职责单一,对外只提供一种可能,而引起类变化的原因都应该只有一个。
开闭原则
(Open-Closed Principle,OCP)
⭐️⭐️⭐️⭐️⭐️
类的改动是通过增加代码进行的,而不是修改源代码
里氏代换原则
(Liskov Substitution Principle,LSP)
⭐️⭐️⭐️⭐️⭐️
任何抽象类出现的地方都可以用他的实现类进行替换,实际就是虚拟机制,语言级别实现面向对象功能。
依赖倒转原则
(Dependence Inversion Priciple,DIP)
⭐️⭐️⭐️⭐️⭐️
依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程。
接口隔离原则
(Interface Segregation Principle,ISP)
⭐️⭐️
不应该强迫用户的程序依赖他们不需要的接口方法。一个接口只提供一种对外功能,不应该把所有操作都封装到一个接口中去。
合成复用原则
(Composite Reuse Principle,CRP)
⭐️⭐️⭐️⭐️
如果使用继承,会导致父类的任何变化都可能影响到子类的行为,如果使用对象组合,就降低了这种依赖关系,对于继承和类,优先使用该组合。
迪米特法则
(Law of Demeter,LoD)
⭐️⭐️⭐️
一个对象应当对其他对象尽可能少的了解,从而降低各个对象之间的耦合,提高系统的可维护性。例如在一个程序中,各个模块之间相互调用时,通常会提供- -个统- -的接口来实现。这样其他模块不需要了解另外一个模块的内部实现细节, 这样当一个模块内部的实现发生改变时,不会影响其他模块的使用。( 黑盒原理)

借鉴了《Easy搞定设计模式》