文章目录

  • 23种设计模式——软件设计模式概述
    • 1、软件设计模式的产生背景
    • 2、软件设计模式的概念与意义
      • 2.1、 软件设计模式的概念
      • 2.2、 学习设计模式的意义
    • 3、软件设计模式的基本要素
    • 4、23种设计模式的分类和功能
      • 4.1、GoF的23种设计模式的分类
      • 4.2、 GoF的23种设计模式的功能
    • 5、面向对象设计七大原则

23种设计模式——软件设计模式概述

1、软件设计模式的产生背景

“设计模式”这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。

1977 年,美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大(Christopher Alexander)在他的著作《建筑模式语言:城镇、建筑、构造(A Pattern Language: Towns Building Construction)中描述了一些常见的建筑设计问题,并提出了 253 种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。

1979 年他的另一部经典著作《建筑的永恒之道》(The Timeless Way of Building)进一步强化了设计模式的思想,为后来的建筑设计指明了方向。

1987 年,肯特·贝克(Kent Beck)和沃德·坎宁安(Ward Cunningham)首先将克里斯托夫·亚历山大的模式思想应用在 Smalltalk 中的图形用户接口的生成中,但没有引起软件界的关注。

直到 1990 年,软件工程界才开始研讨设计模式的话题,后来召开了多次关于设计模式的研讨会。

1995 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书,在本教程中收录了 23 个设计模式,这是设计模式领域里程碑的事件,导致了软件设计模式的突破。这 4 位作者在软件开发领域里也以他们的“四人组”(Gang of Four,GoF)匿名著称。

直到今天,狭义的设计模式还是本文中所介绍的 23 种经典设计模式。

2、软件设计模式的概念与意义

2.1、 软件设计模式的概念

软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。

2.2、 学习设计模式的意义

设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。正确使用设计模式具有以下优点。

  • 可以提高程序员的思维能力、编程能力和设计能力。
  • 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
  • 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。

当然,软件设计模式只是一个引导。在具体的软件幵发中,必须根据设计的应用系统的特点和要求来恰当选择。对于简单的程序开发,能写一个简单的算法要比引入某种设计模式更加容易。但对大项目的开发或者框架设计,用设计模式来组织代码显然更好。

3、软件设计模式的基本要素

软件设计模式使人们可以更加简单方便地复用成功的设计和体系结构,它通常包含以下几个基本要素:模式名称、别名、动机、问题、解决方案、效果、结构、模式角色、合作关系、实现方法、适用性、已知应用、例程、模式扩展和相关模式等,其中最关键的元素包括以下 4 个主要部分。

  1. 模式名称

每一个模式都有自己的名字,通常用一两个词来描述,可以根据模式的问题、特点、解决方案、功能和效果来命名。模式名称(PatternName)有助于我们理解和记忆该模式,也方便我们来讨论自己的设计。

  1. 问题

问题(Problem)描述了该模式的应用环境,即何时使用该模式。它解释了设计问题和问题存在的前因后果,以及必须满足的一系列先决条件。

  1. 解决方案

模式问题的解决方案(Solution)包括设计的组成成分、它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象的 组合)来解决这个问题。

  1. 效果

描述了模式的应用效果以及使用该模式应该权衡的问题,即模式的优缺点。主要是对时间和空间的衡量,以及该模式对系统的灵活性、扩充性、可移植性的影响,也考虑其实现问题。显式地列出这些效果(Consequence)对理解和评价这些模式有很大的帮助。

4、23种设计模式的分类和功能

4.1、GoF的23种设计模式的分类

设计模式有两种分类方法,即根据模式的目的来分和根据模式的作用的范围来分。

  1. 根据目的来分

根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。

  1. 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。

  2. 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。

  3. 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。

  4. 根据作用范围来分

根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。

  1. 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF中的工厂方法、(类)适配器、模板方法、解释器属于该模式。
  2. 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF 中除了以上 4 种,其他的都是对象模式。

下图是23 种设计模式的分类表:

4.2、 GoF的23种设计模式的功能

前面说明了 GoF 的 23 种设计模式的分类,现在对各个模式的功能进行介绍。

  1. 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
  2. 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
  3. 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
  4. 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
  5. 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
  6. 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
  7. 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
  8. 桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
  9. 装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能。
  10. 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
  11. 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。
  12. 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
  13. 模板方法(TemplateMethod)模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
  14. 策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
  15. 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
  16. 职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
  17. 状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力。
  18. 观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
  19. 中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
  20. 迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
  21. 访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
  22. 备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
  23. 解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。

必须指出,这 23 种设计模式不是孤立存在的,很多模式之间存在一定的关联关系,在大的系统开发中常常同时使用多种设计模式

5、面向对象设计七大原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。

1、开闭原则

开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。

2、里氏替换原则

里氏替换原则的含义是:继承必须确保父类所拥有的性质在子类中仍然成立。

通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

3、依赖倒置原则

依赖倒置原则的含义是:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。

4、单一职责原则

单一职责原则的含义是:对象不应该承担太多职责,控制类的粒度大小、将对象解耦、提高其内聚性

5、接口隔离原则

接口隔离原则的含义是:程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。

6、迪米特法则

迪米特法则的含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

7、合成复用法则

合成复用法则的含义是:软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

一句话归纳总结软件设计模式的七大原则,如下表所示

设计原则 一句话归纳 目的
开闭原则 对扩展开放,对修改关闭 降低维护带来的新风险
依赖倒置原则 高层不应该依赖低层,要面向接口编程 更利于代码结构的升级扩展
单一职责原则 一个类只干一件事,实现类要单一 便于理解,提高代码的可读性
接口隔离原则 一个接口只干一件事,接口要精简单一 功能解耦,高聚合、低耦合
迪米特法则 不该知道的不要知道,一个类应该保持对其它对象最少的了解,降低耦合度 只和朋友交流,不和陌生人说话,减少代码臃肿
里氏替换原则 不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义 防止继承泛滥
合成复用原则 尽量使用组合或者聚合关系实现代码复用,少使用继承 降低代码耦合

23种设计模式——软件设计模式概述相关推荐

  1. 快速梳理23种常用的设计模式

    本文旨在快速梳理常用的设计模式,了解每个模式主要针对的是哪些情况以及其基础特征,每个模式前都有列举出一个或多个可以深入阅读的参考网页,以供读者详细了解其实现. 快速回忆 一.创建型 单例(Single ...

  2. 软件设计模式:三个类别,23种方法

    软件设计模式 软件设计模式(Design pattern),又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证 ...

  3. 仓鼠喜欢的23种设计模式(1)

    目录 1.初识设计模式 1.1.什么是设计模式 1.2.为什么使用设计模式 1.3.设计模式的分类 2.UML 2.1.什么是UML 2.2.类图概述 2.3.类图的作用 2.4.类图表示法 4.1. ...

  4. 软件工程-23种设计模式和7大设计原则

    一.前言 软件工程这一个大的学习章节中,其中有23种软件设计模式和七种设计原则需要掌握,下面为大家梳理出相关的知识点. 二.面向对象软件设计原则 1.单一职责原则(Single responsibil ...

  5. c++ 23种设计模式_如何用一句话总结23种设计模式

    专注于Java领域优质技术号,欢迎关注 作者:四月葡萄 前言 断断续续写了一段时间的设计模式,下面对这些设计模式总结一下 设计模式的分类 设计模式一般分为三类:创建型模式.结构型模式.行为型模式. 创 ...

  6. 23种经典设计模式的原理、背后的思想、应用场景(下)

    对程序员来说,除了算法,设计模式也是提升代码能力的关键技能,今天我就想跟你聊聊 23种经典的设计模式. 23种经典设计模式共分为3种类型,分别是创建型.结构型和行为型.今天,我们把这3种类型分成3个对 ...

  7. 软件设计模式--第一章 软件设计模式基础

    目录 第一章 软件设计模式基础 1.软件设计模式概述 (1)什么是软件设计模式 (2)学习设计模式的意义 (3)软件设计模式的基本要素 (4)GoF的23种设计模式简介 2.UML中的类图 (1)统一 ...

  8. 程序员过失泄露代码违法吗_软件过失的23种模式

    程序员过失泄露代码违法吗 Ever since the Gang of Four came down from the mountaintop with their stone tablets, li ...

  9. 设计模式Part1——设计模式概述

    一丶设计模式的诞生与发展 1:设计模式的诞生 模式(Pattern)本诞生于建筑业,美国加利福尼亚大学环境结构中心研究所长Christophere Alexander用了20年的事件,对舒适住宅和周边 ...

最新文章

  1. 在可编辑div中插入文字或图片的问题解决思路
  2. 【新星计划】MATLAB-定义函数
  3. 编写程序判断一个 vector<int> 容器所包含的元素是否9.20: 与一个 list<int> 容器的完全相同。
  4. python爬虫动态解析js_Python爬虫实战入门五:获取JS动态内容—爬取今日头条
  5. 数字图像处理(七)——目标表达和特征测量
  6. 使用 Maven Profile 和 Filtering 打各种环境的包(转)
  7. python爬虫代码-学Python=写爬虫?不用代码也能爬下95%网站的数据!
  8. MSSQL自动备份数据库(转载)
  9. 会计学硕和计算机,会计学与会计硕士有什么区别
  10. 图表背后的秘密 | 技术指标讲解:布林带指标
  11. Android平台语音交友软件源码开发,语音通话的实现
  12. DirectX12(D3D12)基础教程(十九)—— 多实例渲染
  13. (16)全民小视频引流脚本模块化开发10-发送图片私信By飞云脚本学院
  14. Java学习之路 第三章 流程控制
  15. CUDA入门和网络加速学习(一)
  16. 全国青少年软件编程(Scratch)等级考试一级真题——2022.3
  17. “时间就是金钱”的价值观
  18. Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法
  19. 发了两个月传单,转行做了程序员
  20. 走近橄榄球运动·体育项目

热门文章

  1. 有向图转强连通图最少加边数
  2. MySQL中获取当前时间与时间戳
  3. input tabIndex说明
  4. Docker 使用快速入门
  5. JavaScript - 日期型字符串增加天数(日期增加指定天数计算)
  6. 511遇见易语言乐玩插件FindPicEx找图扩展找多图
  7. mysql8.0约束性语语句(主码、外码、NOT NULL/NULL、DEFAULT、UNIQUE、CHECK)
  8. 广西桂林公安:借力大数据 构建大平安
  9. 树结构(Java实现)
  10. 工具说明书 - 英语语法检查工具Grammarly