设计模式介绍

作者: RogerHello | 来源:发表于2018-06-09 11:14 被阅读47次

    1.1  简介

    在70年代后期,一位名叫克里斯托弗亚历山大的建筑师开始了模式的概念。亚历山大的工作重点是在特定环境下寻找特定势力集合的解决方案模式。

    Christopher Alexander是一名土木工程师和建筑师,他的模式与建筑师的建筑师有关,但他所完成的工作激发了对面向对象(OO)社区的兴趣,许多创新者开始开发软件设计模式。 Kent Beck和Ward Cunningham是在OOPSLA会议上为Smalltalk提出设计模式的少数人之一。詹姆斯科利恩是另一位积极推动模式信条的人。

    不久之后,模式社区开始在OOPSLA增长,因为它为成员分享他们关于模式的创新和想法提供了一个环境。另一个模式运动演变的重要论坛是由Kent Beck和Grady Booch创立的Hillside Group。

    这就是设计模式 - 通过一个充满活力的社区蒸馏专业知识。这是最好的人群采购。自从最初的GoF工作以来,十多年来发展起来的模式社区非常庞大而充满活力。 Grady Booch和Celso Gonzalez一直在收集他们在行业中可以找到的所有模式。到目前为止,他们有超过2000人。

    本课程全部是关于设计模式的。在这门课程中,我们将向您展示最有用和最着名的设计模式。在本课中,首先我们将看看设计模式是什么。他们的用途是什么?为什么应该真的使用它们,以及如何使用它们?

    之后,我们还会看到模式是如何组织的,并根据其行为和结构分为不同的组。

    在接下来的几节课中,我们将逐一讨论不同的设计模式。我们将深入分析每个设计模式,并且还会看到如何在Java中实现它们。

    1.2 设计模式是什么

    作为面向对象的开发人员,我们可能会认为我们的代码包含面向对象语言提供的所有好处。我们编写的代码非常灵活,我们可以用更少的或任何的痛苦对其进行任何更改。我们的代码可重复使用,以便我们可以在任何地方重新使用它,而不会有任何问题。我们可以轻松维护我们的代码,任何对部分代码的更改都不会影响代码的其他部分。

    不幸的是,这些优势不是靠自己的。作为一名开发人员,我们有责任以这种方式设计代码,以便我们的代码具有灵活性,可维护性和可重用性。

    设计是一门艺术,它带有经验。但是有一些解决方案已经由一些高级和经验丰富的开发人员编写,同时面临和解决类似的设计问题。这些解决方案被称为设计模式。

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

    设计模式是常见问题的一般可重用解决方案。这些是经验丰富的开发人员使用的最佳实践。模式不是完整的代码,但它可以用作可应用于问题的模板。模式

    可重用;它们可以应用于类似的设计问题,而不管任何领域。换句话说,我们可以将模式看作是包含反复出现的设计问题及其解决方案的正式文档。在一个实际环境中使用的模式也可以在其他环境中重复使用。

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

    一般来说,一个模式有四个基本要素:

    •模式名称,用于为定义设计问题及其解决方案的模式提供单一且有意义的名称。命名设计模式有助于将自己简单地引用到其他人。为文档提供文档也变得很容易,正确的词汇表使得设计更容易思考。

    •问题描述何时应用模式。它解释了问题及其背景。它可能会描述具体的设计问题,例如如何将算法表示为对象。它可能会描述一种类似于僵化设计的症状的对象结构。有时候问题会包含一系列必须满足的条件,才能有意义地应用该模式。

    •解决方案描述组成设计的元素,它们的关系,职责和协作。该解决方案不是完整的代码,但它可以作为一个可以用代码实现的模板。相反,该模式提供了设计问题的抽象描述,以及元素(我们的例子中的类和对象)的一般布置如何解决它。

    •应用模式的结果和后果。软件的后果往往涉及空间和时间的权衡。他们也可以解决语言和实施问题。由于重用通常是面向对象设计中的一个因素,因此模式的后果包括对系统灵活性,可扩展性或可移植性的影响。明确列出这些后果有助于您理解和评估它们。

    1.3  为什么使用设计模式 

    灵活性:使用设计模式,您的代码变得灵活。它有助于提供正确的抽象层次,因为这些抽象层次之间的对象松散耦合,从而使代码易于更改。

    可重用性:松耦合和有凝聚力的对象和类可以使您的代码更加可重用。与高度耦合的代码相比,这种代码很容易被测试。

    共享词汇:共享词汇可以轻松与其他团队成员分享您的代码和想法。它增加了与代码相关的团队成员之间的理解。

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

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

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

    1.4 如何选择及使用设计模式

    有许多设计模式可供选择; 要选择一个,你必须对每一个都有很好的了解。 有许多设计模式看起来非常相似。 他们解决了几乎类似的设计问题,也有类似的实现。 为了实现针对特定设计问题的正确设计模式,必须对它们有非常深入的了解。

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

    •一个类的实例太多,只能表示一件事,对象属性中的值是相同的,而且它们只用作只读:您可以为此设计问题选择Singleton模式,以确保只有整个应用程序的单个实例。它也有助于减少内存大小。

    •课程太依赖对方。一个类的更改会影响所有其他相关类:您可以使用Bridge,Mediator或Command来解决此设计问题。

    •在代码的两个不同部分中有两个不同的不兼容接口,并且您需要将一个接口转换为另一个由客户机代码使用的接口,以使整个代码正常工作:Adapter模式适用于此问题。

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

    1.5模式的分类

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

    •创造型模式•结构模式•行为模式

    1.5.1创建模式

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

    这些模式中有两个反复出现的主题。首先,它们都包含关于系统使用哪些具体类的知识。其次,他们隐藏了这些类的实例是如何创建和放置在一起的。大部分系统都知道对象是由抽象类定义的接口。因此,创建模式为您创建的内容,创建者,创建方式以及创建时间提供了很大的灵活性。

    可能会出现一些情况,当两个或更多模式看起来适合解决问题时。在其他时候,这两种模式相互补充,例如; Builder可以与其他模式一起使用来实现构建哪些组件。

    1.5.2结构模式

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

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

    1.5.3行为模式

    行为模式涉及算法和对象之间的责任分配。行为模式不仅描述对象或类的模式,还描述它们之间的交流模式。这些模式表征了在运行时难以遵循的复杂控制流。他们将注意力从控制流程转移到让您专注于对象相互关联的方式。

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

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

    表1.1:模式列表

    相关文章

      网友评论

        本文标题:设计模式介绍

        本文链接:https://www.haomeiwen.com/subject/ujhteftx.html