23种设计模式简介_设计模式简介

23种设计模式简介

本文是我们名为“ Java设计模式 ”的学院课程的一部分。

在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !

目录

1.简介 2.什么是设计模式 3.为什么使用它们 4.如何选择和使用一个 5.模式分类
5.1。 创作模式 5.2。 结构模式 5.3。 行为模式

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.什么是设计模式

作为一个面向对象的开发人员,我们可能会认为我们的代码包含了面向对象语言所提供的所有好处。 我们编写的代码具有足够的灵活性,以至于我们可以对其进行任何更改,而付出的代价则更少或更少。 我们的代码是可重用的,因此我们可以在任何地方重用它而不会遇到任何麻烦。 我们可以轻松地维护我们的代码,对代码部分的任何更改都不会影响代码的任何其他部分。

不幸的是,这些优势并不是凭空产生的。 作为开发人员,我们有责任以一种使我们的代码灵活,可维护和可重用的方式设计代码。

设计是一门艺术,它伴随着经验。 但是,一些高级和经验丰富的开发人员已经在面对和解决类似的设计问题时已经编写了一些解决方案。 这些解决方案称为设计模式。

设计模式是设计面向对象代码的经验。

设计模式是对常见问题的通用可重用解决方案。 这些是经验丰富的开发人员使用的最佳实践。 模式不是完整的代码,但可以用作可应用于问题的模板。 模式是可重用的; 它们可以应用于任何领域的类似设计问题。 换句话说,我们可以将模式视为包含重复出现的设计问题及其解决方案的正式文档。 在一个实际环境中使用的模式也可以在其他环境中重用。

克里斯托弗曾说过:“每种模式都描述了一个在我们的环境中反复发生的问题,然后描述了该问题的解决方案的核心,这样您就可以使用该解决方案一百万次,而无需做任何事情。以相同的方式两次”。

通常,模式具有四个基本要素:

  1. 模式名称 ,用于为模式提供一个单一且有意义的名称,该名称定义了设计问题及其解决方案。 命名设计模式有助于将自身轻松引用给其他人。 提供文档也变得很容易,正确的词汇使设计更容易思考。
  2. 问题描述了何时应用图案。 它解释了问题及其背景。 它可能描述特定的设计问题,例如如何将算法表示为对象。 它可能描述了不灵活设计的症状的类或对象结构。 有时,问题将包括在应用此模式有意义之前必须满足的条件列表。
  3. 解决方案描述了构成设计的元素,它们之间的关系,职责和协作。 解决方案不是完整的代码,但可以作为模板使用代码来实现。 相反,该模式提供了一个设计问题的抽象描述,以及元素(在本例中为类和对象)的一般布置如何解决该问题的抽象描述。
  4. 应用模式的结果和后果 。 软件的后果通常涉及空间和时间的权衡。 他们也可能解决语言和实施问题。 由于重用通常是面向对象设计中的一个因素,因此模式的后果包括其对系统的灵活性,可扩展性或可移植性的影响。 明确列出这些后果有助于您理解和评估它们。

3.为什么使用它们

灵活性:使用设计模式,您的代码将变得灵活。 由于对象之间的松散耦合,这有助于提供正确的抽象级别,这使您的代码易于更改。

可重用性:松散耦合且内聚的对象和类可使您的代码更可重用。 与高度耦合的代码相比,这种代码变得易于测试。

共享词汇表:共享词汇表可轻松与其他团队成员共享您的代码和思想。 它使与代码相关的团队成员之间有了更多的了解。

捕获最佳实践:设计模式捕获已成功应用于问题的解决方案。 通过学习这些模式和相关问题,一个没有经验的开发人员会学到很多有关软件设计的知识。

设计模式使重用成功的设计和架构变得更加容易。

通过将成熟的技术表示为设计模式,可以使新系统的开发人员更容易使用它们。 设计模式可帮助您选择使系统可重用的设计替代方案,并避免损害可重用性的替代方案。 设计模式甚至可以通过提供对类和对象交互及其基本意图的明确说明来改善现有系统的文档编制和维护。 简而言之,设计模式可帮助设计师更快地“正确”设计。

4.如何选择和使用一个

有多种设计模式可供选择; 要选择一个,您必须对其中的每一个都有很好的了解。 许多设计模式看起来非常相似。 它们解决了几乎类似类型的设计问题,并且具有类似的实现。 为了实现针对特定设计问题的正确设计模式,必须对它们有非常深刻的理解。

首先,您需要确定所面临的设计问题。 设计问题可以分为创造性,结构性或行为性。 根据此类别,您可以过滤模式并选择适当的模式。 例如:

  1. 一个类的实例太多,它们仅表示单个事物,这些对象的属性中的值相同,并且它们仅用作只读 :您可以针对此设计问题选择Singleton模式,以确保仅整个应用程序的单个实例。 它还有助于减小内存大小。
  2. 类之间过于依赖。 一个类中的更改会影响所有其他从属类:您可以使用Bridge,Mediator或Command来解决此设计问题。
  3. 在代码的两个不同部分中有两个不同的不兼容接口,您需要将一个接口转换为另一个接口,客户端代码使用该接口使整个代码正常工作:适配器模式适合此问题。

一种设计模式可以用于解决多个设计问题,并且一个设计问题可以通过多个设计模式解决。 可能会有很多设计问题和解决方案,但是,选择合适的模式取决于您对设计模式的了解和理解。 这也取决于您已经拥有的代码。

5.模式分类

设计模式可以分为以下几类:

  1. 创作模式
  2. 结构模式
  3. 行为模式

创作模式

创新设计模式用于设计对象的实例化过程。 创建模式使用继承来改变对象的创建。

这些模式中有两个重复出现的主题。 首先,它们都封装了有关系统使用哪些具体类的知识。 其次,它们隐藏了这些类的实例是如何创建和组合的。 整个系统对对象的所有了解都是由抽象类定义的它们的接口。 因此,创建模式使您在创建内容,创建者,创建方式和时间方面具有很大的灵活性。

在某些情况下,两个或多个模式看起来很适合解决问题。 在其他时候,这两种模式可以互补。 Builder可以与其他模式一起使用,以实现要构建的组件。

结构模式

结构模式与类和对象如何构成更大的结构有关。 结构类模式使用继承来构成接口或实现。 作为一个简单的示例,请考虑多重继承如何将两个或多个类混合为一个。 结果是一个结合了其父类属性的类。 这种模式对于使独立开发的类库协同工作特别有用。

结构对象模式不是组成接口或实现,而是描述组成对象以实现新功能的方法。 对象合成的附加灵活性来自于在运行时更改合成的能力,而静态类合成则无法实现。

行为模式

行为模式与算法以及对象之间的职责分配有关。 行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。 这些模式表征了复杂的控制流,在运行时很难遵循。 它们将您的注意力从控制流上移开,让您仅专注于对象的互连方式。

行为对象模式使用对象组成而不是继承。 一些描述了一组对等对象如何协作执行一项单个对象无法单独执行的任务。 这里的一个重要问题是对等对象如何相互了解。 对等体可以保持彼此之间的显式引用,但这将增加它们之间的耦合。 在极端情况下,每个对象都会彼此了解。 介体模式通过在对等体之间引入介体对象来避免这种情况。 介体提供松耦合所需的间接定向。

下表显示了各自类别下的模式列表:

创作模式 结构模式 行为模式
抽象工厂 适配器 责任链
建造者 命令
工厂方法 综合 口译员
原型 装饰器 迭代器
辛格尔顿 正面 调解员
飞行重量 纪念
代理 观察者
战略
模板方法
游客

模式清单


翻译自: https://www.javacodegeeks.com/2015/09/introduction-to-design-patterns.html

23种设计模式简介

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现api接口的脚本_Zabbix批量添加主机,Python调用api接口方式【脚本定制】...

使用说明:此脚本使用方法,详细步骤如下(不清楚的可以加我微信或QQ咨询)脚本默认添加内容如excel模板所示:主机名、显示名、IP地址、所属组、所属模板1、所属模板2(如需要添加其他内容如: 多个所属组、多个模板、DNS、SNMP等,可联系…

Spring集成基础知识

本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来,您将深入研究Spring Integration的基础知识,例如通道,转换器和适配器。 在这…

C++最佳实践 | 工具

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删前言C最佳实践: 支持Fork的编码标准文档本文档旨在收集对C最佳实践所进行的协作性讨论,是《Effective C》(Meyers) 和《C Coding Sta…

python resize_Python resize

最新项目flask扩展,用于自动调整代码中图像的大小,以及模板。可以从JPEG PNG SVG转换为JPEG PNG,调整大小以适应和裁剪。提供基于文件和基于s3的存储选项。有关文档,请参见https: ...2020-12-22已阅读: n次django resizer允许动态…

C语言函数返回 1 和返回 0 哪个好?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删基本上,没有人会将大段的C语言代码全部塞入 main() 函数。更好的做法是按照复用率高、耦合性低的原则,尽可能的将代码拆分…

抽象工厂和工厂方法示例_抽象工厂设计模式示例

抽象工厂和工厂方法示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查…

人脸识别像素最低_一种低分辨率图像的人脸识别方法与流程

本发明涉及计算机视觉技术领域,更具体地,涉及一种低分辨率图像的人脸识别方法。背景技术:目前最常用的人脸识别算法是基于卷积神经网络(Convolutional Neural Network,CNN)的,CNN由一系列的卷积操作组成,如…

史上最污技术解读,我竟然秒懂了

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删假设你是个妹子,你有一位男朋友,于此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人。你随时…

textureview 缩放_View的双指缩放以及移动

最近做项目,做到了要让视频缩放的功能,所以写了一个小DEMO,进行双指手势的操作,DEMO是使用TextView做测试,实际使用监听放在TextureView也是正常运行。首先就是记录下触摸屏幕的手指数量,一个手指触摸的时候…

tdd java_Java TDD简介–第1部分

tdd java欢迎来到测试驱动开发 (TDD)系列的介绍。 我们将在TDD上下文中讨论Java和JUnit ,但这只是工具。 本文的主要目的是使您全面了解TDD,而无论使用哪种编程语言和测试框架。 如果您在项目中不使用TDD,那么您要么是…

C++最佳实践 | 代码风格

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C最佳实践:1. 工具2. 代码风格(本文)3. 安全性4. 可维护性5. 可移植性及多线程6. 性能7. 正确性和脚本代码风格代码风格最…

使用map的find头文件_C++ map用法

C 中 map 提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在 map 中出现一次;第二个称之为该关键字的对应值。在一些程序中建立一个 map 可以起到事半功倍的效果&am…

lucene 查询示例_高级Lucene查询示例

lucene 查询示例本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中…

okhttp 连接池_okhttp 源码分析

https://square.github.io/okhttp/​square.github.iosquare/okhttp​github.com0 概述okhttp是一个现代的网络请求框架Http/2 支持 所有访问同一个主机的Request都共用一个socketconnection pool 连接池 减少请求延迟GZIP 压缩数据,减少传输所用的带宽Response Cac…

程序员日均写7行代码被开除,公司:正常员工每天200行

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删根据前不久CSDN发布的《2021-2022中国开发者调查报告》显示,大部分程序员平均每天会写200行左右的代码。那么代码的数量能衡量一个程…

抽象工厂和工厂方法示例_工厂方法设计模式示例

抽象工厂和工厂方法示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查…

rust废铁最快_Rust初体验,它确实有点快

写了多年的Java,某天机缘巧合之下听说了一门语言叫Rust,Rust的亲爹是Mozilla,如果要和其它语言拼爹的话,实力应该还是可以的。官方介绍如下:Rust is blazingly fast and memory-efficient: with no runtime or garbage…

jax-ws和jax-rs_JAX-RS和JSON-P集成

jax-ws和jax-rs这篇简短的文章讨论了JAX-RS 2.0中对JSON-P的支持 JSON-P…? JSON处理API (JSON-P)是Java EE 7中引入的。 它提供了用于处理JSON数据的标准API,并且与XML对应的JAXP非常相似。 JSON-B (JSON绑定&#x…

这10个C语言技巧让初学者少走180天弯路!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删技巧 1:不要使用“GOTO”语句二十几年前,当计算机编程尚处于起步阶段时,程序流程是由“GOTO”语句来控制。该…

flyway版本号_Flyway版本化管理数据库脚本

假如我们有一个叫shiny的项目,它是由一个程序Shiny-Server 和一个数据库 Shiny-DB组成的;简单结构图如下:image.png但是很多时候,现实开发团队是这样的:image.png我们的项目shiny项目的运行环境是有多套的,我们擅长解决…