23种设计模式简介
本文是我们名为“ Java设计模式 ”的学院课程的一部分。
在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !
1.简介
在70年代后期,一位名叫Christopher Alexander的建筑师开始了图案的概念。 亚历山大(Alexander)的工作着眼于在特定环境下找到针对特定力量的解决方案的模式。
Christopher Alexander是一位土木工程师和建筑师,他的模式与建筑物的建筑师有关,但是他所做的工作激发了人们对面向对象(OO)社区的兴趣,许多创新者开始开发软件设计模式。 肯特·贝克(Kent Beck)和沃德·坎宁安(Ward Cunningham)是在OOPSLA会议上介绍Smalltalk设计模式的少数人。 詹姆斯·科普林(James Coplien)是另一位积极倡导模式宗旨的人。
很快,OOPSLA的模式社区开始发展,因为它为成员提供了一个共享其模式创新和思想的环境。 图案运动发展的另一个重要论坛是肯特·贝克(Kent Beck)和格雷迪·布赫(Grady Booch)创立的Hillside Group。
这就是设计模式-旺盛而强大的社区对专业知识的积累。 这是最佳的人群采购。 自从最初的GoF工作以来,模式社区已经发展了十多年,规模庞大且充满活力。 Grady Booch和Celso Gonzalez一直在收集他们在行业中可以找到的每种模式。 到目前为止,他们有2000多个。
本课程全部关于设计模式。 在本课程中,我们将向您介绍最有用和最著名的设计模式。 在本课程中,首先我们将了解真正的设计模式。 它们有什么用? 为什么要真正使用它们,以及如何使用它们?
稍后,我们还将看到模式的组织方式,并根据其行为和结构将其分为不同的组。
在接下来的几课中,我们将逐一讨论不同的设计模式。 我们将深入并分析每种设计模式,还将看到如何在Java中实现它们。
2.什么是设计模式
作为一个面向对象的开发人员,我们可能会认为我们的代码包含了面向对象语言所提供的所有好处。 我们编写的代码具有足够的灵活性,以至于我们可以对其进行任何更改,而付出的代价则更少或更少。 我们的代码是可重用的,因此我们可以在任何地方重用它而不会遇到任何麻烦。 我们可以轻松地维护我们的代码,对代码部分的任何更改都不会影响代码的任何其他部分。
不幸的是,这些优势并不是凭空产生的。 作为开发人员,我们有责任以一种使我们的代码灵活,可维护和可重用的方式设计代码。
设计是一门艺术,它伴随着经验。 但是,一些高级和经验丰富的开发人员已经在面对和解决类似的设计问题时已经编写了一些解决方案。 这些解决方案称为设计模式。
设计模式是设计面向对象代码的经验。
设计模式是对常见问题的通用可重用解决方案。 这些是经验丰富的开发人员使用的最佳实践。 模式不是完整的代码,但可以用作可应用于问题的模板。 模式是可重用的; 它们可以应用于任何领域的类似设计问题。 换句话说,我们可以将模式视为包含重复出现的设计问题及其解决方案的正式文档。 在一个实际环境中使用的模式也可以在其他环境中重用。
克里斯托弗曾说过:“每种模式都描述了一个在我们的环境中反复发生的问题,然后描述了该问题的解决方案的核心,这样您就可以使用该解决方案一百万次,而无需做任何事情。以相同的方式两次”。
通常,模式具有四个基本要素:
- 模式名称 ,用于为模式提供一个单一且有意义的名称,该名称定义了设计问题及其解决方案。 命名设计模式有助于将自身轻松引用给其他人。 提供文档也变得很容易,正确的词汇使设计更容易思考。
- 问题描述了何时应用图案。 它解释了问题及其背景。 它可能描述特定的设计问题,例如如何将算法表示为对象。 它可能描述了不灵活设计的症状的类或对象结构。 有时,问题将包括在应用此模式有意义之前必须满足的条件列表。
- 该解决方案描述了构成设计的元素,它们之间的关系,职责和协作。 解决方案不是完整的代码,但可以作为模板使用代码来实现。 相反,该模式提供了一个设计问题的抽象描述,以及元素(在本例中为类和对象)的一般布置如何解决该问题的抽象描述。
- 应用模式的结果和后果 。 软件的后果通常涉及空间和时间的权衡。 他们也可能解决语言和实施问题。 由于重用通常是面向对象设计中的一个因素,因此模式的后果包括其对系统的灵活性,可扩展性或可移植性的影响。 明确列出这些后果有助于您理解和评估它们。
3.为什么使用它们
灵活性:使用设计模式,您的代码将变得灵活。 由于对象之间的松散耦合,这有助于提供正确的抽象级别,这使您的代码易于更改。
可重用性:松散耦合且内聚的对象和类可使您的代码更可重用。 与高度耦合的代码相比,这种代码变得易于测试。
共享词汇表:共享词汇表可轻松与其他团队成员共享您的代码和思想。 它使与代码相关的团队成员之间有了更多的了解。
捕获最佳实践:设计模式捕获已成功应用于问题的解决方案。 通过学习这些模式和相关问题,一个没有经验的开发人员会学到很多有关软件设计的知识。
设计模式使重用成功的设计和架构变得更加容易。
通过将成熟的技术表示为设计模式,可以使新系统的开发人员更容易使用它们。 设计模式可帮助您选择使系统可重用的设计替代方案,并避免损害可重用性的替代方案。 设计模式甚至可以通过提供对类和对象交互及其基本意图的明确说明来改善现有系统的文档编制和维护。 简而言之,设计模式可帮助设计师更快地“正确”设计。
4.如何选择和使用一个
有多种设计模式可供选择; 要选择一个,您必须对其中的每一个都有很好的了解。 许多设计模式看起来非常相似。 它们解决了几乎类似类型的设计问题,并且具有类似的实现。 为了实现针对特定设计问题的正确设计模式,必须对它们有非常深刻的理解。
首先,您需要确定所面临的设计问题。 设计问题可以分为创造性,结构性或行为性。 根据此类别,您可以过滤模式并选择适当的模式。 例如:
- 一个类的实例太多,它们仅表示单个事物,这些对象的属性中的值相同,并且它们仅用作只读 :您可以针对此设计问题选择Singleton模式,以确保仅整个应用程序的单个实例。 它还有助于减小内存大小。
- 类之间过于依赖。 一个类中的更改会影响所有其他从属类:您可以使用Bridge,Mediator或Command来解决此设计问题。
- 在代码的两个不同部分中有两个不同的不兼容接口,您需要将一个接口转换为另一个接口,客户端代码使用该接口使整个代码正常工作:适配器模式适合此问题。
一种设计模式可以用于解决多个设计问题,并且一个设计问题可以通过多个设计模式解决。 可能会有很多设计问题和解决方案,但是,选择合适的模式取决于您对设计模式的了解和理解。 这也取决于您已经拥有的代码。
5.模式分类
设计模式可以分为以下几类:
- 创作模式
- 结构模式
- 行为模式
创作模式
创新设计模式用于设计对象的实例化过程。 创建模式使用继承来改变对象的创建。
这些模式中有两个重复出现的主题。 首先,它们都封装了有关系统使用哪些具体类的知识。 其次,它们隐藏了这些类的实例是如何创建和组合的。 整个系统对对象的所有了解都是由抽象类定义的它们的接口。 因此,创建模式使您在创建内容,创建者,创建方式和时间方面具有很大的灵活性。
在某些情况下,两个或多个模式看起来很适合解决问题。 在其他时候,这两种模式可以互补。 Builder可以与其他模式一起使用,以实现要构建的组件。
结构模式
结构模式与类和对象如何构成更大的结构有关。 结构类模式使用继承来构成接口或实现。 作为一个简单的示例,请考虑多重继承如何将两个或多个类混合为一个。 结果是一个结合了其父类属性的类。 这种模式对于使独立开发的类库协同工作特别有用。
结构对象模式不是组成接口或实现,而是描述组成对象以实现新功能的方法。 对象合成的附加灵活性来自于在运行时更改合成的能力,而静态类合成则无法实现。
行为模式
行为模式与算法以及对象之间的职责分配有关。 行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。 这些模式表征了复杂的控制流,在运行时很难遵循。 它们将您的注意力从控制流上移开,让您仅专注于对象的互连方式。
行为对象模式使用对象组成而不是继承。 一些描述了一组对等对象如何协作执行一项单个对象无法单独执行的任务。 这里的一个重要问题是对等对象如何相互了解。 对等体可以保持彼此之间的显式引用,但这将增加它们之间的耦合。 在极端情况下,每个对象都会彼此了解。 介体模式通过在对等体之间引入介体对象来避免这种情况。 介体提供松耦合所需的间接定向。
下表显示了各自类别下的模式列表:
创作模式 | 结构模式 | 行为模式 |
抽象工厂 | 适配器 | 责任链 |
建造者 | 桥 | 命令 |
工厂方法 | 综合 | 口译员 |
原型 | 装饰器 | 迭代器 |
辛格尔顿 | 正面 | 调解员 |
飞行重量 | 纪念 | |
代理 | 观察者 | |
州 | ||
战略 | ||
模板方法 | ||
游客 |
模式清单
翻译自: https://www.javacodegeeks.com/2015/09/introduction-to-design-patterns.html
23种设计模式简介